雲計算

玩轉ECS第9講 | ECS雲助手,實現雲上運維自動化

關鍵詞:ECS 運維、遠程操作、自動化

演講嘉賓簡介:朱士鬆 (銳奇),阿里雲技術專家,2016 年加入阿里雲,先後開發了 ECS 售賣約束系統、阿里雲區塊鏈服務,目前負責 ECS 雲助手。

以下內容根據演講視頻以及PPT整理而成。 觀看回放
更多課程請進入“玩轉ECS詳情頁”瞭解

本次分享主要圍繞以下四個方面:

一、雲助手-功能簡介
二、使用說明與演示
三、遠程操作方式比較
四、雲助手的適用場景

一、ECS雲助手簡介

雲助手是阿里雲ECS提供的一種自動化的遠程操作方式,在阿里雲官方的系統鏡像中幾乎都包含有云助手。

雲助手的使用方法比較簡單,只有兩項主要功能:

1、向指定的實例發送命令,對應 API ecs:RunCommand
2、向指定的實例發送文件,對應 API ecs:SendFile

image.png

(一)通過 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/ 左側的“運維與監控” 服務列表這裡

image.png

2、二是 Ecs “實例詳情”頁面的“本實例遠程命令”

image.png

二、使用實踐示例

接下來,咱們通過一個實踐,體驗一下雲助手的使用,實現一項常規的任務:將一個應用的代碼自動部署到 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 實例及交換機

image.png

新建 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 實例。

image.png

image.png

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 的密鑰對

image.png

• 命令名稱: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 ====="

點擊“保存”按鈕,保存該條命令。

image.png

如上圖,已經創建了該條命令,繼續“執行”,並選擇 ECS 實例 code-compile-server

image.png

等待執行完成

image.png

命令執行所生成的 git 公鑰,請用來添加在您的 git 帳號中,以允許從主機 code-compile-server 內從 github 上拉取應用代碼 https://github.com/treesong/aliyun-assist-demo

5.2 生成 ssh 密鑰對,以免密編譯機分發應用包到應用服務器

注:您也可以將應用包上傳到 OOS 中,並在應用服務器內下載應用包

創建以下命令,以初始化編譯機(code-compile-server),作用:

• 生成一個 ssh 密鑰對,以用於 scp 應用包到應用服務器

image.png

• 命令名稱: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 文件內容)

image.png

• 命令名稱: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-* 實例

image.png

7、編譯與分發代碼

7.1 拉取最新的代碼,編譯打包,並分發到應用服務器

image.png

創建命令選項:

• 命令名稱: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)

image.png

8、啟動/重啟 Web 應用

在 webapp-server-* 上啟動應用

• 檢查與安裝 JRE
• 停止 WebApp
• 啟動 WebApp

image.png

創建命令選項:

• 命令名稱: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-*

image.png

執行命令,並等待執行完成

image.png

9、掛載應用服務器到 SLB,以供互聯網訪問

image.png

操作小結
通過以上的演示,大家可以看到,全程不需要連接進入實例系統內部;通過使用雲助手發送腳本命令,就可以完成實例內部的變更運維操作;
因此,你可以通過阿里雲 OpenAPI 自動化的實現以上操作,並且當代碼有更新時,自動觸發該系列操作,實現自動更新應用。可以訪問 https://github.com/treesong/aliyun-assist-demo 獲得更多的自動化腳本,或使用阿里雲提供的相關應用部署服務。

三、遠程操作方式比較

image.png

相比於其他常用登入系統的方式,例如 Linux SSH 或 Windows 的 RemteDesktop ,雲助手的以下多個方面的個方面優勢:

1. 免公網流量:
雲助手的功能實現,是通過控制系統來完成。所以不需要讓實例暴露在公網上,即有利於實例的安全,也節省了公網流量費用。

2. 免登入系統:
登入系統需要有系統的帳號用戶與密碼,或者私鑰;而密碼與私鑰的使用與管理上有許多不便。雲助手一切操作使用都基於阿里雲帳號AK,有云上強大的帳號/AK 管理體系。

3. 有權限控制:
通過 RAM 角色與權限的管理,所以做到嚴格的控制子帳號是否執行特定操作的能力,可以事前防止不被授權的操作。

4. 有操作審計:
同樣,雲上的 API 操作都有 ActionTrail 記錄,可以被事後審計。

5. 支持自動化:
這也是雲助手最顯著的優勢,有了 API 就可以很容易的跟其他系統集成,以實現雲上運維的

四、雲助手的適用場景

image.png

通過上的介紹與演示,咱們可以體會到,藉助雲助手,能夠自動化的處理 ECS 實例創建後的多個使用環節,例如:

• 系統與應用的安裝配置
• 服務程序的部署與更新
• 系統的監控與數據採集
• 系統的問題診斷與修復

阿里雲也有在這些方面上繼續豐富的服務,給大家的工作來帶來更多的便利。

結束& 感謝

感謝大家的收看,今天的分享就到這裡,歡迎持續關注阿里雲-玩轉 ECS 系列視頻/文章。


關注百曉生,笑談雲計算

二維碼-三分之一.gif

Leave a Reply

Your email address will not be published. Required fields are marked *