• ECS云助手,实现云上运维自动化


     

    导读:云时代的运维是怎么样的?如何快人一步实践 云上自动化运维?

    本次分享将为大家介绍在 ECS 实例内部署与更新应用、监控系统或应用的运行状态、以及批量操作多个实例内部系统的这些场景下,如何使用 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 "_____
    
    "
    
    ## 检测/安装 GIT
    
    git --version
    
    if [ $? = 127 ]; then
    
        yum install -y git
    
        echo "install git done"
    
    fi;
    
    printf "_____
    
    "
    
    ## 检测/下载 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 "_____
    
    "
    
    ## 更新 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 "treesong@github.com" 
    
          -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 "ruiqi@alibaba-inc.com" 
    
          -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 "ruiqi@alibaba-inc.com")
    
        
    
        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 "ruiqi@alibaba-inc.com"
    
    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 git@github.com: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 "_____
    
    "
    
    ## 编译代码
    
    export PATH=/root/apache-maven/bin/:$PATH
    
    echo "> mvn clean package -Dmaven.test.skip=true"
    
    mvn clean package -Dmaven.test.skip=true
    
    printf "_____
    
    "
    
    ## 分发代码
    
    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 "_____
    
    "
    
    ## 停止 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 "_____
    
    "
    
    ## 启动 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 "_____
    
    "
    
        
    
        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 实例创建后的多个使用环节,例如:

    • 系统与应用的安装配置
    • 服务程序的部署与更新
    • 系统的监控与数据采集
    • 系统的问题诊断与修复

    阿里云也有在这些方面上继续丰富的服务,给大家的工作来带来更多的便利。

  • 相关阅读:
    DevExpress ASP.NET v19.1版本亮点:Pivot Grid等控件
    .NET界面控件DevExpress全新发布v19.1.5|改进Office 2019主题
    Kendo UI for jQuery使用教程:操作系统/jQuery支持等
    Web安全篇之SQL注入攻击
    SQL Server中timestamp(时间戳)和rowversion(版本戳)
    PyCharm2019 激活码
    性能测试 vs 负载测试 vs 压力测试
    一套完整的压力测试项目文档
    Visual Studio性能计数器,负载测试结果分析- Part III
    Visual Studio进行负载测试,RIG和负载测试术语- Part II
  • 原文地址:https://www.cnblogs.com/tanxingjisuan/p/14273514.html
Copyright © 2020-2023  润新知