0. 服務器資源之痛
現在筆者所在的團隊中有 50+ 個研發及測試工程師,由於工作需要經常使用 20+ 臺服務器進行研發或者測試工作。那麼如何掌控這些機器的使用狀態就是一個比較麻煩的事情。
爲了做好這個事情,團隊內嘗試過:
- 設置共享文檔進行使用前進行填寫:不規範而且時長忘記更新,且自動化使用與非自動化使用的鴻溝很難跨越
- 設置專人進行管理:對口的人太多,效率低下,工作附加值低
看來,改革服務器管理方案勢在必行。
1. 方案及效果
通過梳理需求,我們發現其實服務器資源管理的核心述求如下:
- 無需服務器管理員這樣的專職崗位
- 收集團隊的設備列表
- 知道當前每臺設備是否被人使用及其詳情(申請人、申請時長、申請事項)
- 無人使用的設備可以作爲資源池被自動化調用
最終我們藉助 Jenkins 的能力實現的上述述求,首先所有設備信息維護在 Jenkins 上,默認狀態無人使用,故支持被自動化調用:
當需要申請某臺設備進行使用時,需填寫下表:
表格填寫完成,Jenkins會自動幫助你“佔領”這臺機器,且在狀態也告知其他人相關使用信息(申請人、申請時長、申請事項):
2. 實現過程細節
2.1 設備命名方式
需要根據團隊中的使用習慣進行設計,由於筆者所在團隊主要從事CPU/GPU密集計算相關工作,所以我們約定按照:
“設備類型-CPU-內存-GPU-IP”的形式來命名機器。其中:
- 設備類型包含:PM-物理機、VM-虛擬機、DM-Docker
- CPU:型號*數量
- 內存:總大小
- GPU:型號*數量
- IP:略
2.2 Jenkins 設備管理設置
- #of executors:設置爲1,保證一旦被申請,就不會被其他人或者其他自動化任務所使用
- Usage:設置爲Only build jobs with label expressions matching this node,保證設備佔用前需要有明確的意圖,減少資源浪費的可能
2.3 Jenkins Pipeline 腳本編寫
pipeline {
agent none
parameters {
string(name: 'user', defaultValue: '', description: '申請人')
string(name: 'machine', defaultValue: '', description: '申請機器IP')
string(name: 'time', defaultValue: '', description: '申請使用時間,正整數形式,以小時爲單位')
string(name: 'task', defaultValue: '', description: '所要執行的任務')
}
stages {
stage('parameters check') {
when {
anyOf {
environment name: 'machine', value: ''
}
}
steps {
error '參數錯誤,無法構建:未指定使用機器'
}
}
stage('use machine') {
agent { label env.machine }
steps {
script {
releasetime=sh(returnStdout: true, script: 'date +%Y%m%d%H%M -d \'+(${time}) hours\'')
buildName "${BUILD_DISPLAY_NAME}_${user}_${releasetime}_${task}"
sh label: '', script: '''let seconds=${time}*3600
sleep $seconds'''
}
}
}
}
}