当您需要多次查询ROS模板中某个参数时,可以将参数值存储在阿里云运维编排服务OOS(Operation Orchestration Service)的参数仓库中,然后在ROS模板中输入该参数名称即可。

背景信息

OOS参数仓库中可以存储普通参数或加密参数,加密参数可以将保存的值通过KMS服务进行加密。本文以创建一组ECS实例为例,为您介绍使用OOS参数仓库创建参数,并编写ROS模板引用这些参数的方法。本示例将会创建以下参数:

参数 参数名称 参数种类 参数类型 参数值
ImageId my_image 普通参数 String centos_7_9_x64_20G_alibase_2020****.vhd
SecurityGroupIds security_group_ids 普通参数 StringList sg-group1,sg-group2
Password Password 加密参数 String MyPassword1

关于参数的更多信息,请参见ALIYUN::ECS::InstanceGroup

说明 创建参数时,您需要选择与资源栈相同的地域。例如:您将使用模板在华东1(杭州)创建资源栈,则需要将参数存储到相同地域。

步骤一:在运维编排控制台创建参数

  1. 登录运维编排控制台
  2. 在左侧导航栏,单击参数仓库
  3. 在页面左上角的地域下拉列表,选择参数的所在地域。
    参数的所在地域需要和资源栈所在地域相同,本示例为华东1(杭州)
  4. 创建普通参数ImageId。
    1. 参数仓库页面,单击普通参数,然后单击创建普通参数
    2. 创建普通参数页面,配置参数名称,选择参数类型
      本示例中,您需要进行如下配置:
      • 参数名称:my_image。
      • 参数类型:String。
      • :centos_7_9_x64_20G_alibase_2020****.vhd。
    3. 单击创建
      创建完成后,您可以在普通参数页签,单击ImageId参数名称,在描述页签查看名称、版本、类型、值等信息。
  5. 创建普通参数SecurityGroupIds。
    1. 参数仓库页面,单击普通参数,然后单击创建普通参数
    2. 创建普通参数页面,配置参数名称,选择参数类型
      本示例中,您需要进行如下配置:
      • 参数名称:security_group_ids。
      • 参数类型:StringList。
      • :sg-group1,sg-group2。
    3. 单击创建
      创建完成后,您可以在普通参数页签,单击SecurityGroupIds参数名称,在描述页签查看名称、版本、类型、值等信息。
  6. 创建加密参数Password。
    1. 参数仓库页面,单击加密参数,然后单击创建加密参数
    2. 创建加密参数页面,配置参数名称,选择KMS密钥ID
      本示例中,您需要进行如下配置:
      • 参数名称:Password。
      • KMS密钥ID:Default Service CMK。
      • :MyPassword1。
    3. 单击创建
      创建完成后,您可以在加密参数页签,单击Password参数名称,在描述页签单击右侧的显示,获取Password取值。加密参数

步骤二:编写ROS模板

当您创建参数后,可以编写ROS模板,在Parameters或Resources中引用参数:

  • 在Parameters中引用

    您需要将Type设置为ALIYUN::OOS::Parameter::Value(普通参数)或ALIYUN::OOS::SecretParameter::Value(加密参数)。

    例如:您可以通过如下代码引用普通参数ImageId的最新版本取值。

    "Parameters": {
      "ImageId":{
        "Type":"ALIYUN::OOS::Parameter::Value",
        "Default": "my_image"
      }
    }

    您也可以将参数设置为my_image:1,表示引用版本1的取值。

  • 在Resources中引用

    您可以在Resource的Properties中引用参数,格式为: {{resolve:<参数类型>:<参数名称>:<参数版本号>}}

    • 参数类型(必填)

      存储参数的服务。取值:

      • oos:普通参数。
      • oos-secret:加密参数。
    • 参数名称(必填)

      参数的名称。

    • 参数版本号(选填)

      参数的版本,若不填写则为最新版本。

    例如:您可以通过如下代码引用普通参数ImageId的最新版本取值、加密参数Password版本2的取值。

    "Resources": {
      "ECS": {
        "Type": "ALIYUN::ECS::Instance",
        "Properties": {
          "ImageId": "{{resolve:oos:my_image}}",
          "Password": "{{resolve:oos-secret:Password:2}}",
          ...
        }
      }
    }

模板中引用参数时支持大部分函数。更多信息,请参见函数(Functions)。不支持的函数为:Ref、Fn::GetAtt、Fn::GetStackOutput、Fn::Calculate。

本示例中模板如下:

{
  "ROSTemplateFormatVersion": "2015-09-01",
  "Parameters": {
    "InstanceType": {
      "Type": "String",
      "Default": "ecs.c6.large"
    },
    "ImageId": {
      "Type": "ALIYUN::OOS::Parameter::Value",
      "Default": "my_image"
    },
    "Vpc": {
      "Type": "String"
    },
    "VSwitch": {
      "Type": "String"
    }
  },
  "Resources": {
    "ECS": {
      "Type": "ALIYUN::ECS::InstanceGroup",
      "Properties": {
        "ImageId": {
          "Ref": "ImageId"
        },
        "InstanceType": {
          "Ref": "InstanceType"
        },
        "VpcId": {
          "Ref": "Vpc"
        },
        "VSwitchId": {
          "Ref": "VSwitch"
        },
        "SecurityGroupIds": "{{resolve:oos:security_group_ids:1}}",
        "Password": "{{resolve:oos-secret:Password}}",
        "MaxAmount": 1
      }
    }
  },
  "Outputs": {
    "InstanceIds": {
      "Value": {
        "Fn::GetAtt": [
          "ECS",
          "InstanceIds"
        ]
      }
    }
  }
}

ROS模板引用的参数会基于OOS参数类型进行转换。当前OOS参数支持String和StringList类型,如果引用了StringList类型参数,ROS会将其转换为List类型在模板中使用。例如:类型为StringList的参数SecurityGroupIds,值为sg-group1,sg-group2。当您创建ALIYUN::ECS::InstanceGroup资源时,SecurityGroupIds取值将解析为["sg-group1", "sg-group2"]。

步骤三:在资源编排控制台创建资源栈

资源编排控制台使用步骤二中的示例模板创建资源栈,创建一组ECS实例。具体操作,请参见创建资源栈

资源栈创建成功后,您可以在资源编排控制台左侧菜单栏单击资源栈,在资源栈列表页面找到目标资源栈并单击资源栈名称,在资源栈详情页单击参数页签查看参数及取值,验证模板参数引用是否正确。