背景與痛點
阿裡雲的客戶遠端在ECS内部執行指令是最常見的運維操作之一了,比如在ECS内安裝解除安裝軟體,啟動停止某個程序,等等。很多情況下,還需要對一個ECS清單中的多台ECS,統一的執行某個相同的指令并彙聚執行的結果。
一個可行的方案是利用SSH遠端連接配接到ECS上執行指令,但是開放ECS的SSH端口給internet通路是危險的。客戶可以通過自建跳闆機來間接通路ECS以解決安全性的問題,但是這帶來了複雜度和成本的上升。
Ansible是業界比較流行的開源的運維工具,但是其認證是獨立于阿裡雲的賬号體系之外的,無法通過阿裡雲的官方工具進行權限控制,其操作記錄也無法在阿裡雲上進行審計。
如果使用者使用的是Windows版本的ECS,雖然可以利用PowerShell遠端執行指令,但是配置和維護過程更加困難。
在此,我們向大家推薦阿裡雲官方的批量在多台ECS内執行指令的最佳實踐:運維編排服務OOS+雲助手。雲助手提供了在ECS内執行指令的原子能力,運維編排服務OOS則附加了更豐富的批量、定時、事件驅動、自定義模闆等能力,兩者結合,可以讓ECS運維工作變得既安全又簡單高效。
準備工作
準備工作隻有兩個簡單步驟。
首先,請通路運維編排OOS的控制台點一下“立即開通”按鈕完成服務的開通。這是一個免費服務,請放心開通。
https://oos.console.aliyun.com/
開通之後,請確定您已安裝和配置了阿裡雲指令行工具CLI,且版本号大于等于 3.0.19。該CLI在Github上的下載下傳連結為:
https://github.com/aliyun/aliyun-cli/releases開始執行
我們直接先看一個例子,我要針對cn-beijing地域的["i-1234","i-5678"]這兩台遠端Linux ECS,執行“echo 123”這個shell指令,我隻需要在我本地的shell終端裡,輸入指令:
ali-xxxxxx:~ shengbo$ aliyun oos StartExecution --region cn-beijing --TemplateName ACS-ECS-BulkyRunCommand --Parameters '{"commandType":"RunShellScript", "commandContent":"echo 123", "targets":{"Type":"ResourceIds", "ResourceIds":["i-1234","i-5678"]}, "rateControl":{"maxErrors":0,"mode":"Concurrency"}, "OOSAssumeRole":"" }'
簡單解釋一下上面這個指令,它調用了oos的StartExecution的API,啟動官方提供的公共模闆ACS-ECS-BulkyRunCommand,傳入包含了ECS執行個體清單(ResourceIds)和執行内容(commandContent)的參數。
該指令會傳回一個json結構,如果你能找到"ExecutionId": "exec-xxxxx", 那麼恭喜你,你指定的指令已經開始在遠端執行了。
螢幕快照 2019-10-14 下午7.25.30.png
請記錄下ExecutionId,然後作為參數輸入到下面的ListExecutions指令查詢執行的過程和結果:
ali-6c96cfde303d:~ shengbo$ aliyun oos ListExecutions --region cn-beijing --ExecutionId exec-xxxx
如果指令正在運作中,你會看到類似如下的結果,Status是“running”。TotalTasks是總的指令數,SuccessTasks是已經執行成功的指令數。兩個數字的差,就是還待執行的指令數。
你可以多次執行同樣的ListExecutions指令進行檢視,直到看到Outputs表示整個指令的結果,對于本例,為兩台ECS上的标準輸出:
進階-自定義模闆
在上面的例子裡,指令的參數有點過于複雜,其實我可以自定義模闆把參數固定下來,讓執行的指令變得格外簡單。
自定義模闆的指令如下,你可以根據自己的需要進行改寫:
aliyun oos CreateTemplate --region cn-beijing --TemplateName sample123 --Content '{
"FormatVersion": "OOS-2019-06-01",
"Tasks": [
{
"Name": "runCommand",
"Action": "ACS::ECS::RunCommand",
"Properties": {
"commandContent": "echo 1234",
"instanceId": "{{ ACS::TaskLoopItem }}",
"commandType": "RunShellScript"
},
"Loop": {
"Items": [
"i-1234",
"i-5678"
],
"Outputs": {
"commandOutputs": {
"AggregateType": "Fn::ListJoin",
"AggregateField": "commandOutput"
}
}
},
"Outputs": {
"commandOutput": {
"Type": "String",
"ValueSelector": "invocationOutput"
}
}
}
],
"Outputs": {
"commandOutputs": {
"Type": "List",
"Value": "{{ runCommand.commandOutputs }}"
}
}
}'
今後,你隻需要執行如下指令就可以完成和前面一樣的效果了
ali-6c96cfde303d:~ shengbo$ aliyun oos StartExecution --region cn-beijing --TemplateName sample123 --Parameters '{}'
此指令調用oos的StartExecution這個API,執行sample123這個自定義模闆,不需要額外傳入參數。
當然,前面用CLI所做的一切操作,都可以在OOS控制台用白屏化的方式執行,連結為:
了解更多
運維編排OOS是阿裡雲的運維自動化平台,适用于批量、定時、事件驅動、跨區域運維等場景,除了在ECS内執行指令外,還可以完成ECS建立釋放,啟停,變配,網絡帶寬更新,挂載雲盤等等各種操作。
如果想了解更多,加入釘釘群“運維編排OOS支援群”,群号23330931。我們會有值班人員線上支援。
OOS管理控制台的連結:
https://oos.console.aliyun.comOOS幫助文檔的連結
https://help.aliyun.com/product/119529.html