關鍵詞: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.html
2、發送文件 (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-service
2、代碼編譯機:一臺 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)
• 公網IP:不需要
• 實例名稱:webapp-server-
• 主機名稱:webapp-server-
• 有序後輟:是,為 實例名稱 和 主機名 添加有序後綴
• 其他選項:可使用默認值,或按需自由設置
確認訂單,以創建 ECS 實例。
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 上拉取應用代碼 https://github.com/treesong/aliyun-assist-demo
5.2 生成 ssh 密鑰對,以免密編譯機分發應用包到應用服務器
注:您也可以將應用包上傳到 OOS 中,並在應用服務器內下載應用包
創建以下命令,以初始化編譯機(code-compile-server),作用:
• 生成一個 ssh 密鑰對,以用於 scp 應用包到應用服務器
• 命令名稱:2-generate-ssh-key.sh
• 命令類型:Shell
• 命令內容:(如下,或從 https://github.com/treesong/aliyun-assist-demo 獲得)
• 使用參數:是
## 生成 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
• 命令內容:(如下,或從 https://github.com/treesong/aliyun-assist-demo 獲得)
• 使用參數:是
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
• 命令類型:Shell
• 命令內容:(如下,或從 https://github.com/treesong/aliyun-assist-demo 獲得)
• 使用參數:是
## [編譯機]
## 下載源代碼
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
• 命令類型:Shell
• 命令內容:(如下,或從 https://github.com/treesong/aliyun-assist-demo 獲得)
## 阿里雲-雲助手使用演示
## [應用服務器]
## 安裝 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 自動化的實現以上操作,並且當代碼有更新時,自動觸發該系列操作,實現自動更新應用。可以訪問 https://github.com/treesong/aliyun-assist-demo 獲得更多的自動化腳本,或使用阿里雲提供的相關應用部署服務。
三、遠程操作方式比較
相比於其他常用登入系統的方式,例如 Linux SSH 或 Windows 的 RemteDesktop ,雲助手的以下多個方面的個方面優勢:
1. 免公網流量:
雲助手的功能實現,是通過控制系統來完成。所以不需要讓實例暴露在公網上,即有利於實例的安全,也節省了公網流量費用。
2. 免登入系統:
登入系統需要有系統的帳號用戶與密碼,或者私鑰;而密碼與私鑰的使用與管理上有許多不便。雲助手一切操作使用都基於阿里雲帳號AK,有云上強大的帳號/AK 管理體系。
3. 有權限控制:
通過 RAM 角色與權限的管理,所以做到嚴格的控制子帳號是否執行特定操作的能力,可以事前防止不被授權的操作。
4. 有操作審計:
同樣,雲上的 API 操作都有 ActionTrail 記錄,可以被事後審計。
5. 支持自動化:
這也是雲助手最顯著的優勢,有了 API 就可以很容易的跟其他系統集成,以實現雲上運維的
四、雲助手的適用場景
通過上的介紹與演示,咱們可以體會到,藉助雲助手,能夠自動化的處理 ECS 實例創建後的多個使用環節,例如:
• 系統與應用的安裝配置
• 服務程序的部署與更新
• 系統的監控與數據採集
• 系統的問題診斷與修復
阿里雲也有在這些方面上繼續豐富的服務,給大家的工作來帶來更多的便利。
結束& 感謝
感謝大家的收看,今天的分享就到這裡,歡迎持續關注阿里雲-玩轉 ECS 系列視頻/文章。
關注百曉生,笑談雲計算