關鍵詞:ECS 運維、遠端操作、自動化
演講嘉賓簡介:朱士松 (銳奇),阿裡雲技術專家,2016 年加入阿裡雲,先後開發了 ECS 售賣限制系統、阿裡雲區塊鍊服務,目前負責 ECS 雲助手。
以下内容根據演講視訊以及PPT整理而成。
觀看回放 更多課程請進入“ 玩轉ECS詳情頁”了解
本次分享主要圍繞以下四個方面:
一、雲助手-功能簡介
二、使用說明與示範
三、遠端操作方式比較
四、雲助手的适用場景
一、ECS雲助手簡介
雲助手是阿裡雲ECS提供的一種自動化的遠端操作方式,在阿裡雲官方的系統鏡像中幾乎都包含有雲助手。
雲助手的使用方法比較簡單,隻有兩項主要功能:
1、向指定的執行個體發送指令,對應 API ecs:RunCommand
2、向指定的執行個體發送檔案,對應 API ecs:SendFile

(一)通過 API 使用雲助手
1、發送指令 (RunCommand)
發送指令的功能,由 ECS:RunCommand API 承載,API 的主要參數如下:
aliyun ecs RunCommand \
--RegionId="cn-shenzhen" \
--InstanceId.1="i-wz9g75dkmfp0ofsplnlr" \
--InstanceId.2="i-wz9g75dkmfp0ofsplnls" \
--Type="RunShellScript" \
--CommandContent="yum install -y git" \
--Timeout=60
• 參數:"RegionId" - 指的是目标 ECS 執行個體所在的地域
• 參數:"InstanceId - 可以指定該地域下的一個或多個 ECS 執行個體
• 參數:"Type" - 指的是腳本類型,目前支援三種:分别是
• Linux 上支援執行 Shell 腳本,類型值 RunShellScript
• Windows 上支援的 Batch 與 PowerShell 腳本,類型值 RunBatScript 與 RunPowerShellScript
• 參數:"CommandContent" - 指的是腳本内容,比如目前示例通過 yum 安裝 git 用戶端
• 參數:Timeout - 批的時腳本執行逾時時間,預設60秒;
• 關于 ecs:RunCommand 的詳細 API 文檔:
https://help.aliyun.com/document_detail/141751.html. • 推薦使用 aliyun 指令行工具 ( https://help.aliyun.com/document_detail/110244.html) 執行阿裡雲 API。
調用了 RunCommand 之後,将會建立一個任務,并傳回 InvokeId 值;之後可使用 DescribeInvocationResults 輪論這次任務的執行進度與結果;關于 DescribeInvocationResults 說明,請參見文檔:
https://help.aliyun.com/document_detail/64845.html2、發送檔案 (SendFile)
發送檔案的功能,由 SendFile API 承載,API 的主要參數如下:
aliyun ecs SendFile \
--RegionId="cn-shenzhen" \
--InstanceId.1="i-wz9g75dkmfp0ofsplnlr" \
--InstanceId.2="i-wz9g75dkmfp0ofsplnls" \
--TargetDir="/root/.ssh/" \
--Name="authorized_keys" \
--Content="ssh-rsa AAAA...."
• 其他參數:RegionId & InstanceId - 指定執行個體所在地域和執行個體 ID 清單
• 參數:TargetDir 與 Name - 分别指定檔案在執行個體上的目錄名與檔案名
• 參數:Content - 指定檔案的内容
• 關于 ecs:SendFile 的詳細 API 文檔:
https://help.aliyun.com/document_detail/184118.html
調用了 SendFile 之後,也将會建立一個任務,并傳回 InvokeId ;之後可使用 DescribeSendFileResults 輪論這次任務的執行進度與結果。
了解了以上兩對 API,也就學會雲助手的主要用法,那麼就可以在腳本或代碼中使用。
(二)通過控制台使用雲助手
如果想通過阿裡雲控制台使用雲助手,可以從這個兩個位置找到“雲助手”控制台:
1、一是 Ecs 控制台
https://ecs.console.aliyun.com/左側的“運維與監控” 服務清單這裡
2、二是 Ecs “執行個體詳情”頁面的“本執行個體遠端指令”
二、使用實踐示例
接下來,咱們通過一個實踐,體驗一下雲助手的使用,實作一項正常的任務:将一個應用的代碼自動部署到 ECS 伺服器上,并且當代碼更新時立即更新服務。
(一)準備的資源
将要使用的資源如下:
1、應用代碼:這裡使用示例代碼是 spring-boot 的官方示例程式 gs-rest-service 并稍有修改。
代碼庫位址
https://github.com/treesong/gs-rest-service2、代碼編譯機:一台 ECS,将安裝 JDK + git + maven, 負責下載下傳和編譯代碼并打包;
3、Web伺服器:三台 ECS,負責将安裝 JRE,部署代碼包,并啟動 Web 應用;
4、負載均衡:一個 SLB,後端挂載這三台Web應用伺服器,并對外提供服務;
(二)操作的步驟
操作步驟如下:
1、建立虛拟專有網絡(VPC)與虛拟交換機
如果您已經擁有虛拟專有網絡與虛拟交換機,可以跳過本步驟。
轉到 VPC 控制台 (
https://vpc.console.aliyun.com/vpc/cn-shenzhen/vpcs/new),建立 VPC 執行個體及交換機
建立 VPC 的設定項:
• VPC 名稱:vpc-for-assist-demo——IPv4 網段:192.168.0.0/16
• 交換機名稱:vsw-for-axt-demo-d——IPv4 網絡:192.168.0.0/29
• 其他選項:可使用預設值,或按需自由設定
注:在實際應用中,您也可以根據網絡規劃需要,選擇使用其他網段
2. 建立一台 ECS 執行個體,用作編譯伺服器
建立 ECS 的設定項:
• 數量:1 台
• 鏡像: CentOS,或其他 Linux 類型
• 網絡:專有網絡,并選擇上一步建立的專有網絡(vpc-for-assist-demo)與交換機(vsw-for-axt-demo-d)
• 公網IP:不需要
• 執行個體名稱:code-compile-server
• 主機名稱:code-compile-server
确認訂單,以建立 ECS 執行個體。
3、另建立兩台 ECS 執行個體,用作應用伺服器
在現有的 VPC 執行個體 vpc-for-assist-demo 下,另建立一個新虛拟交換機執行個體,設定項:
• 交換機名稱:vsw-for-axt-demo-e
• IPv4 網絡:192.168.1.0/29
在新的虛拟交換機執行個體 (vsw-for-axt-demo-e) 下,建立 3 台 ECS 作為應用伺服器,設定項:
• 數量:2 台
• 鏡像:CentOS,或其他 Linux 類型
• 網絡:專有網絡,并選擇上一步建立的專有網絡執行個體與互動機(vsw-for-axt-demo-e)
• 執行個體名稱:webapp-server-
• 主機名稱:webapp-server-
• 有序後辍:是,為 執行個體名稱 和 主機名 添加有序字尾
4、配置 VPC 網絡以允許 ECS 執行個體出公網
因需要從公網上下載下傳源代碼等,是以需要允許 ECS 執行個體 code-compile-server 可通路公網,需要:
• 配置 vpc-for-assist-demo 的 NAT 網關
• 為該 NAT 網關建立 SNAT 條目,為 vsw-for-axt-demo-d 綁定一個公網 IP
(略過該步驟的詳細過程,如需詳細步驟,請參考 VPC 的使用資料)
5、編譯機的初始化
轉到雲助手的控制台 (
https://ecs.console.aliyun.com/#/cloudAssistant/region/cn-shenzhen)。
5.1 編譯機的初始化
建立以下指令,以初始化編譯機(code-compile-server),作用
• 安裝 JDK
• 安裝 GIT
• 下載下傳 Maven 并配置 settings.xml
• 生成通路 github.com 的密鑰對
• 指令名稱:1-init-compiler-server.sh
• 指令類型:Shell
• 逾時時間:600(秒)
• 指令内容:(如下,或從
https://github.com/treesong/aliyun-assist-demo 獲得)
## 阿裡雲-雲助手使用示範
## [編譯機]
## 檢測/安裝 JDK
java -version
if [ $? = 127 ]; then
yum install -y java-1.8.0-openjdk-devel
echo "install java done"
java -version
fi;
printf "_____\n\n"
## 檢測/安裝 GIT
git --version
if [ $? = 127 ]; then
yum install -y git
echo "install git done"
fi;
printf "_____\n\n"
## 檢測/下載下傳 Maven
cd /root
if [ ! -d "/root/apache-maven" ]; then
wget -q https://mirrors.bfsu.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.zip
unzip -q -o -d ./ ./apache-maven-3.6.3-bin.zip
ln -s /root/apache-maven-3.6.3/ /root/apache-maven
fi;
export PATH=/root/apache-maven/bin/:$PATH
mvn --version
printf "_____\n\n"
## 更新 maven settings.xml 配置
echo '
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<localRepository>/root/.m2/repository</localRepository>
<mirrors>
<mirror>
<id>aliyun</id>
<name>aliyun Maven</name>
<mirrorOf>central</mirrorOf>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>
<mirror>
<id>CN</id>
<name>OSChina Central</name>
<url>http://maven.oschina.net/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
<profiles></profiles>
</settings>
' > /root/apache-maven/conf/settings.xml
## 生成 git 密鑰
if [ ! -f "/root/.ssh/id_rsa_git" ]; then
ssh-keygen -q -t rsa -b 4096 \
-C "[email protected]" \
-f /root/.ssh/id_rsa_git \
-N ""
fi;
## 配置自動選擇 git 密鑰
echo "host github.com
HostName github.com
StrictHostKeyChecking no
User treesong
IdentityFile /root/.ssh/id_rsa_git
" > /root/.ssh/config
echo "===== beging pub key for git ====="
cat /root/.ssh/id_rsa_git.pub
echo "===== end pub key for git ====="
點選“儲存”按鈕,儲存該條指令。
如上圖,已經建立了該條指令,繼續“執行”,并選擇 ECS 執行個體 code-compile-server
等待執行完成
指令執行所生成的 git 公鑰,請用來添加在您的 git 帳号中,以允許從主機 code-compile-server 内從 github 上拉取應用代碼
5.2 生成 ssh 密鑰對,以免密編譯機分發應用包到應用伺服器
注:您也可以将應用包上傳到 OOS 中,并在應用伺服器内下載下傳應用包
建立以下指令,以初始化編譯機(code-compile-server),作用:
• 生成一個 ssh 密鑰對,以用于 scp 應用包到應用伺服器
• 指令名稱:2-generate-ssh-key.sh • 使用參數:是
## 生成 ssh 密鑰
if [ ! -f "/root/.ssh/id_rsa_ssh" ]; then
ssh-keygen -q -t rsa -b 4096 \
-C "[email protected]" \
-f /root/.ssh/id_rsa_ssh \
-N ""
fi;
echo "===== begin pub key for ssh ====="
cat /root/.ssh/id_rsa_ssh.pub
echo "===== end pub key for git ====="
echo ""
done;
選擇執行個體 code-compile-server 并執行該腳本,執行完成後将顯示新生成的 id_rsa_ssh.pub 檔案内容。
6. 應用伺服器的初始化
6.1 添加 ssh 免密登入公鑰到應用伺服器 (webapp-server-*)
• 添加 ssh 免密登入公鑰 (公鑰内容來自上一步生成的 id_rsa_ssh.pub 檔案内容)
• 指令名稱:3-append-ssh-keys
• 指令類型:shell
if [ -f "/root/.ssh/authorized_keys" ]; then
ssh_key=$(cat /root/.ssh/authorized_keys | grep "[email protected]")
if [ -z "${ssh_key}" ]; then
echo "{{ssh-rsa-pub}}" >> /root/.ssh/authorized_keys
fi;
else
echo "{{ssh-rsa-pub}}" > /root/.ssh/authorized_keys
fi;
echo "===== content of ssh-rsa-pub ====="
cat /root/.ssh/authorized_keys | grep "[email protected]"
mkdir -p /root/webapp
執行指令 3-append-ssh-keys.sh,選項:
• 參數 ssh-ras-pub:内容填入 2-generate-ssh-key 生成與列印的 id_rsa_ssh.pub 檔案内容
• 目标執行個體:選擇全部的 webapp-server-* 執行個體
7、編譯與分發代碼
7.1 拉取最新的代碼,編譯打包,并分發到應用伺服器
建立指令選項:
• 指令名稱:4-pull-build-deploy-code
## [編譯機]
## 下載下傳源代碼
if [ ! -d "/root/source/gs-rest-service" ]; then
mkdir -p /root/source && cd /root/source
git clone [email protected]:treesong/gs-rest-service.git
fi;
## 拉取新代碼
echo "> cd /root/source/gs-rest-service/complete"
cd /root/source/gs-rest-service/complete
echo "> git pull ..."
git pull && git checkout {{branch}}
printf "_____\n\n"
## 編譯代碼
export PATH=/root/apache-maven/bin/:$PATH
echo "> mvn clean package -Dmaven.test.skip=true"
mvn clean package -Dmaven.test.skip=true
printf "_____\n\n"
## 分發代碼
if [ ! -z "{{vm-ip-list}}" ]; then
for ip in {{vm-ip-list}}; do
echo "> scp *.jar to $ip ..."
scp -i /root/.ssh/id_rsa_ssh.pub ./target/rest-service-0.0.1-SNAPSHOT.jar root@$ip:/root/webapp/
done;
echo "copy files done."
else
echo "copy files skip."
fi;
執行指令選項:
• 指令參數:
• branch: 等部署的代碼分支
• vm-ip-list:應用伺服器 IP 清單
• 目标執行個體:代碼伺服器(code-compile-server)
8、啟動/重新開機 Web 應用
在 webapp-server-* 上啟動應用
• 檢查與安裝 JRE
• 停止 WebApp
• 啟動 WebApp
• 指令名稱:5-start-webapp-server
## 阿裡雲-雲助手使用示範
## [應用伺服器]
## 安裝 JRE/JDK
java -version
if [ $? = 127 ]; then
echo "install jdk ..."
yum install -y java-1.8.0-openjdk-devel
echo "install jdk done"
java -version
fi;
printf "_____\n\n"
## 停止 WebApp
pid=$(jps -l | grep jar | cut -d' ' -f 1)
if [[ $pid =~ ^[0-9]+$ ]]; then
jps -l | grep jar
echo "stop java process $pid ..."
kill -9 $pid
fi;
pid=$(jps -l | grep rest | cut -d' ' -f 1)
if [[ $pid =~ ^[0-9]+$ ]]; then
jps -l | grep rest
echo "stop java process $pid ..."
kill -9 $pid
fi;
printf "_____\n\n"
## 啟動 WebApp
if [ -f "/root/webapp/rest-service-0.0.1-SNAPSHOT.jar" ]; then
echo "> ls -l1 --color "/root/webapp""
ls -l1 --color "/root/webapp"
printf "_____\n\n"
echo "start java rest webapp ..."
/bin/bash -c "java -jar /root/webapp/rest-service-0.0.1-SNAPSHOT.jar > /dev/null &"
for i in {1..60}; do
echo "[$i] > curl -s http://localhost:8080/ping"
msg=$(curl -s http://localhost:8080/ping)
if [ "$msg" = "pong" ]; then
echo "[$i] > $msg"
pid=$(jps -l | grep rest | cut -d' ' -f 1)
echo "java webapp started, pid: $pid"
break;
fi;
echo "wait for java webapp starts ...."
sleep 2
done;
else
echo "file not exists: /root/webapp/rest-service-0.0.1-SNAPSHOT.jar"
exit 127
fi;
• 目标執行個體:選擇全部的 webapp-server-*
執行指令,并等待執行完成
9、挂載應用伺服器到 SLB,以供網際網路通路
操作小結
通過以上的示範,大家可以看到,全程不需要連接配接進入執行個體系統内部;通過使用雲助手發送腳本指令,就可以完成執行個體内部的變更運維操作;
是以,你可以通過阿裡雲 OpenAPI 自動化的實作以上操作,并且當代碼有更新時,自動觸發該系列操作,實作自動更新應用。可以通路
獲得更多的自動化腳本,或使用阿裡雲提供的相關應用部署服務。
相比于其他常用登入系統的方式,例如 Linux SSH 或 Windows 的 RemteDesktop ,雲助手的以下多個方面的個方面優勢:
1. 免公網流量:
雲助手的功能實作,是通過控制系統來完成。是以不需要讓執行個體暴露在公網上,即有利于執行個體的安全,也節省了公網流量費用。
2. 免登入系統:
登入系統需要有系統的帳号使用者與密碼,或者私鑰;而密碼與私鑰的使用與管理上有許多不便。雲助手一切操作使用都基于阿裡雲帳号AK,有雲上強大的帳号/AK 管理體系。
3. 有權限控制:
通過 RAM 角色與權限的管理,是以做到嚴格的控制子帳号是否執行特定操作的能力,可以事前防止不被授權的操作。
4. 有操作審計:
同樣,雲上的 API 操作都有 ActionTrail 記錄,可以被事後審計。
5. 支援自動化:
這也是雲助手最顯著的優勢,有了 API 就可以很容易的跟其他系統內建,以實作雲上運維的
通過上的介紹與示範,咱們可以體會到,借助雲助手,能夠自動化的處理 ECS 執行個體建立後的多個使用環節,例如:
• 系統與應用的安裝配置
• 服務程式的部署與更新
• 系統的監控與資料采集
• 系統的問題診斷與修複
阿裡雲也有在這些方面上繼續豐富的服務,給大家的工作來帶來更多的便利。
結束& 感謝
感謝大家的收看,今天的分享就到這裡,歡迎持續關注阿裡雲-玩轉 ECS 系列視訊/文章。
關注百曉生,笑談雲計算