文档

通过阿里云CLI调用OOS API

更新时间:

本文会介绍下通过阿里云CLI,在ECS实例内以命令行的形式对阿里云各云产品的OpenApi调用。

什么是阿里云CLI

阿里云命令行工具(Alibaba Cloud Command Line Interface)是在Alibaba Cloud SDK for Go之上构建的开源工具。您可以在命令行Shell中,使用aliyun命令与阿里云服务进行交互,管理您的阿里云资源。详见什么是阿里云CLI

安装指南

支持多个系统安装:

linux:在Linux上安装阿里云CLI

windows:在Windows上安装阿里云CLI

macOS:在macOS上安装阿里云CLI

配置凭证及调试

在使用阿里云CLI之前,您需要配置调用阿里云资源所需的凭证信息、地域、语言等。CLI支持多种凭证类型,如AccessKey、STS Token、RamRoleArn和EcsRamRole,详细参考非交互式配置

由于在OOS生态下大部分为自动化场景,本文着重介绍下较易上手的,EcsRamRole凭证类型的非交互配置。

首先明确凭证的权限来源,那么在自动化场景下一般我们采用实例的RAM角色作为权限来源,需先为目标实例授予实例RAM角色,授予方式可参考授予实例RAM角色

假设我们给一台Linux实例授予了名为InstanceRole的RAM角色。

完成授予后,我们则登录到实例终端,来安装并配置CLI。安装及配置脚本如下。

mkdir -p  $HOME/aliyun
cd $HOME/aliyun
wget https://aliyuncli.alicdn.com/aliyun-cli-linux-3.0.51-amd64.tgz
tar xzvf aliyun-cli-linux-3.0.51-amd64.tgz
cp $HOME/aliyun/aliyun /usr/bin/
ramRoleName="InstanceRole"
regiond_id=cn-zhangjiakou
aliyun configure set --profile ecsRamRoleProfile --mode EcsRamRole --region $regiond_id --ram-role-name $ramRoleName

上面脚本先是完成CLI安装,然后将region配置为cn-zhangjiakou,并且将已授予实例的RAM角色名InstanceRole设为CLI权限来源。

那么此时可以测试下CLI ,先可以调用该region下OOS的API,首先查询下OOS都有哪些可用API,返回结果如图,此时表示CLI配置已生效。

aliyun OOS
oos

API调用参考

我们可以通过 aliyun oos ApiName --help 查询API入参方式,比如查询ListTemplates的用法。

aliyun oos ListTemplates --help
oos

接着我们试着根据API要求,调用OOS的ListTemplates API来查询模版情况,可看到返回模版信息如下。

aliyun OOS ListTemplates  --MaxResults 10
oos

也可调用CreateTemplate创建OOS模版,可创建JSON/YAML格式的模版,模版内容及命令如下。

FormatVersion: OOS-2019-06-01
Description: Views the ECS instances by specifying instance status.
Parameters:
  regionId:
    Description: The ID of region.
    Type: String
    Default: '{{ ACS::RegionId }}'
  status:
    Description: The ECS instances status for query instances.
    Type: String
Tasks:
  - Name: describeInstances
    Action: 'ACS::ExecuteAPI'
    Description: Views the ECS instances by specifying instance status.
    Properties:
      Service: ECS
      API: DescribeInstances
      Parameters:
        RegionId: '{{ regionId }}'
        Status: '{{ status }}'
    Outputs:
      instanceIds:
        Type: List
        ValueSelector: 'Instances.Instance[].InstanceId'
Outputs:
  instanceIds:
    Type: List
    Value: '{{ describeInstances.instanceIds }}'

{
  "FormatVersion": "OOS-2019-06-01",
  "Description": "Views the ECS instances by specifying instance status.",
  "Parameters": {
    "regionId": {
      "Description": "The ID of region.",
      "Type": "String",
      "Default": "{{ ACS::RegionId }}"
    },
    "status": {
      "Description": "The ECS instances status for query instances.",
      "Type": "String"
    }
  },
  "Tasks": [
    {
      "Name": "describeInstances",
      "Action": "ACS::ExecuteAPI",
      "Description": "Views the ECS instances by specifying instance status.",
      "Properties": {
        "Service": "ECS",
        "API": "DescribeInstances",
        "Parameters": {
          "RegionId": "{{ regionId }}",
          "Status": "{{ status }}"
        }
      },
      "Outputs": {
        "instanceIds": {
          "Type": "List",
          "ValueSelector": "Instances.Instance[].InstanceId"
        }
      }
    }
  ],
  "Outputs": {
    "instanceIds": {
      "Type": "List",
      "Value": "{{ describeInstances.instanceIds }}"
    }
  }
}

#给json/yaml模版内容加上单引号''
content='{ "FormatVersion": "OOS-2019-06-01", "Description": "Views the ECS instances by specifying instance status.", "Parameters": { "regionId": { "Description": "The ID of region.", "Type": "String", "Default": "{{ ACS::RegionId }}" }, "status": { "Description": "The ECS instances status for query instances.", "Type": "String" } }, "Tasks": [ { "Name": "describeInstances", "Action": "ACS::ExecuteAPI", "Description": "Views the ECS instances by specifying instance status.", "Properties": { "Service": "ECS", "API": "DescribeInstances", "Parameters": { "RegionId": "{{ regionId }}", "Status": "{{ status }}" } }, "Outputs": { "instanceIds": { "Type": "List", "ValueSelector": "Instances.Instance[].InstanceId" } } } ], "Outputs": { "instanceIds": { "Type": "List", "Value": "{{ describeInstances.instanceIds }}" } } }'
aliyun oos CreateTemplate --TemplateName template01 --Content  "$content"
oos

通过StartExecution为已存在的我的模版创建执行。

regionId="cn-zhangjiakou"  # 资源执行的地域
status="Running"
parameters="{
  \"regionId\": \"$regionId\",
  \"status\": \"$status\"
}"
aliyun oos StartExecution --TemplateName template01 --Parameters "${parameters}"
oos

通过StartExecution为已有公共模版创建执行。

regionId="cn-zhangjiakou"  # 执行的地域
securityGroupId="sg-8vb*********xwvnuqy6" # 请准备安全组参数用于创建临时实例
vSwitchId="vsw-8*******0z9ykpzv01c" # 请准备交换机参数用于创建临时实例
instanceType="ecs.g5.large" # 临时实例的实例规格
sourceImageId="centos_7_8_x64_20G_alibase_20200622.vhd" #要更新的源镜像
commandType="RunShellScript"  # 脚本类型
commandContent='ls\npwd\n'
parameters="{
  \"securityGroupId\": \"$securityGroupId\",
  \"commandType\": \"$commandType\",
  \"sourceImageId\": \"$sourceImageId\",
  \"regionId\": \"$regionId\",
  \"vSwitchId\": \"$vSwitchId\",
  \"instanceType\": \"$instanceType\",
  \"commandContent\": \"$commandContent\"
}"
aliyun oos StartExecution --TemplateName ACS-ECS-UpdateImage --Parameters "${parameters}"
oos

总结

相信聪明的您早就发现了,只要给该实例授予的RAM 角色,并且该角色具备相关云产品OpenAPI的操作权限,则可通过CLI在命令行调用阿里云各种OpenAPI,所以我们也可以通过云助手执行CLI命令,在OOS中编排CLI执行也完全没问题,编写脚本时,只要把它当成普通的命令一样用就可以。

  • 本页导读 (0)
文档反馈