在云助手命令中使用OOS参数仓库

在云助手命令中使用自定义参数,可以更加灵活地编写脚本,提高命令的复用性。同时,系统运维管理OOS提供参数仓库功能,支持普通参数和加密参数。您可以在云助手命令中结合OOS的参数仓库功能,更为方便和安全地管理自定义参数。

前提条件

背景信息

在云助手命令中,您可以直接使用{{parameterName}}方式表示自定义参数。例如云助手命令adduser {{username}},表示为Linux实例添加用户名。此时,username表示一个自定义参数,您可以在RunCommandInvokeCommandParameters参数中传入具体的取值。

通过引用系统运维管理参数仓库中的参数,您可以以更灵活的方式使用参数。参数仓库定义的参数分为普通参数和加密参数,云助手分别以{{oos:}}{{oos-secret:}}的方式定义普通参数和加密参数。

在云助手命令中使用普通参数

如果您使用RAM用户执行云助手命令,需要为RAM用户配置策略。具体操作,请参见创建自定义权限策略为RAM用户授权。允许RAM用户使用普通参数执行云助手命令,需要使用云助手和参数仓库相关的API权限。具体RAM权限策略如下:

{
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ecs:DescribeInstances",
                "ecs:DescribeTagKeys",
                "ecs:DescribeTags",
                "ecs:CreateCommand",
                "ecs:DescribeCommands",
                "ecs:InvokeCommand",
                "ecs:RunCommand",
                "ecs:DeleteCommand",
                "ecs:DescribeInvocations",
                "ecs:DescribeInvocationResults",
                "ecs:StopInvocation",
                "ecs:DescribeCloudAssistantStatus",
                "ecs:InstallCloudAssistant",
                "oos:GetParameters",
                "oos:GetParameter"
            ],
            "Resource": "*"
        }
    ],
    "Version": "1"
}

如果您的命令不涉及敏感数据,可以使用普通参数。本节以在Linux实例中增加新用户为例,介绍如何在云助手命令中使用OOS参数仓库的普通参数。

  1. 通过系统运维管理OOS的参数仓库创建普通参数。具体操作,请参见普通参数

    以下示例表示在普通参数中新增一个username参数,取值为user01,您可以根据实际情况修改。

    名称

    示例值

    参数名称

    username

    参数类型

    String

    user01

  2. 通过Java SDK调用RunCommand,执行云助手命令。

    以下示例表示通过云助手命令为Linux实例创建一个新用户,命令内容为adduser {{oos:username}}。其中,{{oos:username}}表示新用户名由OOS参数仓库的普通参数username定义。

    import com.aliyuncs.DefaultAcsClient;
    import com.aliyuncs.IAcsClient;
    import com.aliyuncs.ecs.model.v20140526.RunCommandRequest;
    import com.aliyuncs.ecs.model.v20140526.RunCommandResponse;
    import com.aliyuncs.exceptions.ClientException;
    import com.aliyuncs.exceptions.ServerException;
    import com.aliyuncs.profile.DefaultProfile;
    import com.google.gson.Gson;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class AddUserName {
        public static void main(String[] args) {
            // 请确保代码运行环境设置了环境变量ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。
            // 工程代码泄露可能会导致AccessKey泄露,并威胁账号下所有资源的安全性。以下代码示例使用环境变量获取AccessKey的方式进行调用,建议使用更安全的STS方式。
            DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
            IAcsClient client = new DefaultAcsClient(profile);
    
            RunCommandRequest request = new RunCommandRequest();
            // 设置实例所在的地域。
            request.setRegionId("cn-hangzhou");
            // 设置云助手命令的语言类型,示例表示使用shell语言。
            request.setType("RunShellScript");
            // 设置云助手命令内容,示例表示为Linux新增一个用户,用户名由OOS参数仓库的普通参数username决定。
            request.setCommandContent("adduser {{oos:username}}");
    
            List<String> instanceIdList = new ArrayList<String>();
            // 设置运行云助手命令的实例ID。
            instanceIdList.add("i-bp1dktddjsg7oh11****");
            request.setInstanceIds(instanceIdList);
            // 设置云助手命令支持自定义参数。
            request.setEnableParameter(true);
    
            try {
                RunCommandResponse response = client.getAcsResponse(request);
                System.out.println(new Gson().toJson(response));
            } catch (ServerException e) {
                e.printStackTrace();
            } catch (ClientException e) {
                System.out.println("ErrCode:" + e.getErrCode());
                System.out.println("ErrMsg:" + e.getErrMsg());
                System.out.println("RequestId:" + e.getRequestId());
            }
        }
    }

    执行结果如下所示:

    {
        "requestId": "67D1BD1A-0D08-42C3-AFD9-A3397CD67CD1",
        "commandId": "c-hz01hkgs19i****",
        "invokeId": "t-hz01hkgs19s****"
    }
  3. 检查云助手命令执行结果。

    您可以登录ECS实例检查云助手命令是否生效。以下示例表示在Linux实例中检查是否新增用户user01。

    1. 登录ECS实例。

      具体操作,请参见通过密码或密钥认证登录Linux实例

    2. 运行以下命令查看是否已经新增user01用户。

      cat /etc/passwd |grep user01

      以下结果表示已经成功新增user01用户。新增user01

在云助手命令中使用加密参数

如果您使用RAM用户执行云助手命令,需要为RAM用户配置策略。具体操作,请参见创建自定义权限策略为RAM用户授权。允许RAM用户使用加密参数执行云助手命令,需要使用云助手、参数仓库及KMS相关的API权限。具体RAM权限策略如下:

{
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ecs:DescribeInstances",
                "ecs:DescribeTagKeys",
                "ecs:DescribeTags",
                "ecs:CreateCommand",
                "ecs:DescribeCommands",
                "ecs:InvokeCommand",
                "ecs:RunCommand",
                "ecs:DeleteCommand",
                "ecs:DescribeInvocations",
                "ecs:DescribeInvocationResults",
                "ecs:StopInvocation",
                "ecs:DescribeCloudAssistantStatus",
                "ecs:InstallCloudAssistant",
                "oos:GetParameters",
                "oos:GetSecretParameters",
                "oos:GetParameter",
                "oos:GetSecretParameter",
                "kms:GetSecretValue"
            ],
            "Resource": "*"
        }
    ],
    "Version": "1"
}

如果您的命令涉及敏感数据(例如服务器密码、数据库密码等),建议使用加密参数,以提高命令的安全性。本节以在Linux实例中修改用户密码为例,介绍如何在云助手命令中使用OOS参数仓库的加密参数。

说明

执行以下操作前,实例中需要已经创建目标用户。关于如何为Linux实例添加新用户,请参见在云助手命令中使用普通参数

  1. 通过系统运维管理OOS的参数仓库创建加密参数和普通参数。具体操作,请参见加密参数普通参数

    以下示例表示在OOS参数仓库中创建用户名参数username和密码参数password。

    • 在普通参数中新增一个用户名参数username,取值为user01,您可以根据实际情况修改。

      名称

      示例值

      参数名称

      username

      参数类型

      String

      user01

    • 在加密参数中新增一个密码参数password,取值为MyPassword01,您可以根据实际情况修改。

      名称

      示例值

      参数名称

      password

      KMS密钥ID

      Default Service CMK

      MyPassword01

      说明

      此密码仅做示例,请不要在线上环境使用。

  2. 为目标实例设置RAM角色。

    1. 创建RAM角色。具体操作,请参见创建可信实体为阿里云服务的RAM角色

      相关配置示例如下所示。

      名称

      示例

      当前可信实体类型

      选择阿里云服务

      角色类型

      选择普通服务角色

      角色名称

      AxtParametersRamRole

      选择受信服务

      在下拉栏中选择云服务器

    2. 创建RAM角色相关权限策略。具体操作,请参见创建自定义权限策略

      策略名称为AxtParametersRamPolicy,策略内容如下所示,表示允许调用KMS和OOS的相关API(GetSecretValueGetParametersGetSecretParametersGetParameterGetSecretParameter)。

      {
          "Version": "1",
          "Statement": [
              {
                  "Action": [
                      "kms:GetSecretValue"
                  ],
                  "Resource": "*",
                  "Effect": "Allow"
              },
              {
                  "Action": [
                      "oos:GetParameters",
                      "oos:GetSecretParameters",
                      "oos:GetParameter",
                      "oos:GetSecretParameter"
                  ],
                  "Effect": "Allow",
                  "Resource": "*"
              }
          ]
      }
    3. 为RAM角色(AxtParametersRamRole)设置策略权限(AxtParametersRamPolicy)。具体操作,请参见为RAM角色授权

    4. 为目标ECS实例设置RAM角色(AxtParametersRamRole)。具体操作,请参见授予实例RAM角色

  3. 通过Java SDK调用RunCommand,执行云助手命令。

    以下示例表示通过云助手命令为Linux实例修改用户密码,命令内容如下所示:

     "echo '{{oos-secret:password}}' | passwd '{{oos:username}}' --stdin"

    其中,{{oos-secret:password}}表示用户新密码由OOS参数仓库的加密参数password定义;{{oos:username}}表示用户名由OOS参数仓库的普通参数username定义。

    import com.aliyuncs.DefaultAcsClient;
    import com.aliyuncs.IAcsClient;
    import com.aliyuncs.ecs.model.v20140526.RunCommandRequest;
    import com.aliyuncs.ecs.model.v20140526.RunCommandResponse;
    import com.aliyuncs.exceptions.ClientException;
    import com.aliyuncs.exceptions.ServerException;
    import com.aliyuncs.profile.DefaultProfile;
    import com.google.gson.Gson;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class ChangePassword {
        public static void main(String[] args) {
            // 请确保代码运行环境设置了环境变量ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。
            // 工程代码泄露可能会导致AccessKey泄露,并威胁账号下所有资源的安全性。以下代码示例使用环境变量获取AccessKey的方式进行调用,建议使用更安全的STS方式。
            DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
            IAcsClient client = new DefaultAcsClient(profile);
    
            RunCommandRequest request = new RunCommandRequest();
            // 设置实例所在的地域。
            request.setRegionId("cn-hangzhou");
            // 设置云助手命令的语言类型,示例表示使用shell语言。
            request.setType("RunShellScript");
            // 设置云助手命令内容,示例表示为Linux的用户(用户名为username取值)修改密码(密码为password取值)。
            request.setCommandContent(
                    "echo '{{oos-secret:password}}' | passwd '{{oos:username}}' --stdin");
    
            List<String> instanceIdList = new ArrayList<String>();
            instanceIdList.add("i-bp1dktddjsg7oh11****");
            request.setInstanceIds(instanceIdList);
            request.setEnableParameter(true);
    
            try {
                RunCommandResponse response = client.getAcsResponse(request);
                System.out.println(new Gson().toJson(response));
            } catch (ServerException e) {
                e.printStackTrace();
            } catch (ClientException e) {
                System.out.println("ErrCode:" + e.getErrCode());
                System.out.println("ErrMsg:" + e.getErrMsg());
                System.out.println("RequestId:" + e.getRequestId());
            }
        }
    
    }

    执行结果如下所示:

    {
        "requestId": "C73D7B90-6503-4DB4-844C-9412AC55ECC5",
        "commandId": "c-hz01hnyd4e8****",
        "invokeId": "t-hz01hnyd4ed****"
    }
  4. 检查云助手命令执行结果。

    您可以使用修改后的密码远程登录ECS实例,确认云助手命令是否生效。具体操作,请参见通过密码或密钥认证登录Linux实例