首頁>科技>

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

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

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

ECS雲助手簡介

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

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

1、向指定的例項傳送命令,對應 API ecs:RunCommand2、向指定的例項傳送檔案,對應 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 獲得)

## 阿里雲-雲助手使用演示## [編譯機]## 檢測/安裝 JDKjava -versionif [ $? = 127 ]; then    yum install -y java-1.8.0-openjdk-devel    echo "install java done"    java -versionfi;printf "_____\n\n"## 檢測/安裝 GITgit --versionif [ $? = 127 ]; then    yum install -y git    echo "install git done"fi;printf "_____\n\n"## 檢測/下載 Mavencd /rootif [ ! -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-mavenfi;export PATH=/root/apache-maven/bin/:$PATHmvn --versionprintf "_____\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/configecho "===== beging pub key for git ====="cat /root/.ssh/id_rsa_git.pubecho "===== 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.pubecho "===== 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_keysfi;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.gitfi;## 拉取新程式碼echo "> cd /root/source/gs-rest-service/complete"cd /root/source/gs-rest-service/completeecho "> git pull ..."git pull && git checkout {{branch}}printf "_____\n\n"## 編譯程式碼export PATH=/root/apache-maven/bin/:$PATHecho "> mvn clean package -Dmaven.test.skip=true"mvn clean package -Dmaven.test.skip=trueprintf "_____\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/JDKjava -versionif [ $? = 127 ]; then    echo "install jdk ..."    yum install -y java-1.8.0-openjdk-devel    echo "install jdk done"    java -versionfi;printf "_____\n\n"## 停止 WebApppid=$(jps -l | grep jar | cut -d' ' -f 1)if [[ $pid =~ ^[0-9]+$ ]]; then   jps -l | grep jar    echo "stop java process $pid ..."   kill -9 $pidfi;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 $pidfi;printf "_____\n\n"## 啟動 WebAppif [ -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 127fi;

執行命令選項:

• 目標例項:選擇全部的 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 例項建立後的多個使用環節,例如:

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

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

21
最新評論
  • 整治雙十一購物亂象,國家再次出手!該跟這些套路說再見了
  • 續華為後馬斯克也發威了!稱將開發手機作業系統挑戰安卓和iOS