天天看點

ECS雲助手,實作雲上運維自動化

ECS雲助手,實作雲上運維自動化

導讀:雲時代的運維是怎麼樣的?如何快人一步實踐 雲上自動化運維?

本次分享将為大家介紹在 ECS 執行個體内部署與更新應用、監控系統或應用的運作狀态、以及批量操作多個執行個體内部系統的這些場景下,如何使用 ECS 雲助手實作雲上自動化運維。

作者 | 阿裡雲技術專家 朱士松

來源 | 彈性計算百曉生

ECS雲助手簡介

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

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

1、向指定的執行個體發送指令,對應 API ecs:RunCommand

2、向指定的執行個體發送檔案,對應 API ecs:SendFile

ECS雲助手,實作雲上運維自動化

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

ECS雲助手,實作雲上運維自動化

2、二是 Ecs “執行個體詳情”頁面的“本執行個體遠端指令”

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 執行個體及交換機

ECS雲助手,實作雲上運維自動化

建立 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 執行個體。

ECS雲助手,實作雲上運維自動化
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 台

• 網絡:專有網絡,并選擇上一步建立的專有網絡執行個體與互動機(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 的密鑰對

ECS雲助手,實作雲上運維自動化

• 指令名稱: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雲助手,實作雲上運維自動化

如上圖,已經建立了該條指令,繼續“執行”,并選擇 ECS 執行個體 code-compile-server

ECS雲助手,實作雲上運維自動化

等待執行完成

ECS雲助手,實作雲上運維自動化

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

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

注:您也可以将應用包上傳到 OOS 中,并在應用伺服器内下載下傳應用包

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

• 生成一個 ssh 密鑰對,以用于 scp 應用包到應用伺服器
ECS雲助手,實作雲上運維自動化

• 指令名稱: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 檔案内容)
ECS雲助手,實作雲上運維自動化

• 指令名稱: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-* 執行個體

ECS雲助手,實作雲上運維自動化

7、編譯與分發代碼

  • 7.1 拉取最新的代碼,編譯打包,并分發到應用伺服器
ECS雲助手,實作雲上運維自動化

建立指令選項:

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

ECS雲助手,實作雲上運維自動化
• 指令名稱: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-*
ECS雲助手,實作雲上運維自動化

執行指令,并等待執行完成

ECS雲助手,實作雲上運維自動化

9、挂載應用伺服器到 SLB,以供網際網路通路

ECS雲助手,實作雲上運維自動化

操作小結

通過以上的示範,大家可以看到,全程不需要連接配接進入執行個體系統内部;通過使用雲助手發送腳本指令,就可以完成執行個體内部的變更運維操作;

是以,你可以通過阿裡雲 OpenAPI 自動化的實作以上操作,并且當代碼有更新時,自動觸發該系列操作,實作自動更新應用。可以通路 https://github.com/treesong/aliyun-assist-demo 獲得更多的自動化腳本,或使用阿裡雲提供的相關應用部署服務。

遠端操作方式比較

ECS雲助手,實作雲上運維自動化

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

1. 免公網流量:

雲助手的功能實作,是通過控制系統來完成。是以不需要讓執行個體暴露在公網上,即有利于執行個體的安全,也節省了公網流量費用。

2. 免登入系統:

登入系統需要有系統的帳号使用者與密碼,或者私鑰;而密碼與私鑰的使用與管理上有許多不便。雲助手一切操作使用都基于阿裡雲帳号AK,有雲上強大的帳号/AK 管理體系。

3. 有權限控制:

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

4. 有操作審計:

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

5. 支援自動化:

這也是雲助手最顯著的優勢,有了 API 就可以很容易的跟其他系統內建,以實作雲上運維的

雲助手的适用場景

ECS雲助手,實作雲上運維自動化

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

• 系統與應用的安裝配置

• 服務程式的部署與更新

• 系統的監控與資料采集

• 系統的問題診斷與修複

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

繼續閱讀