公共参数最佳实践

当执行不同的模板却有部分相同的参数值时,基本每次需要查询相应的参数值并分别填写在不同的执行中。所以期望可以将部分的模板执行参数,存储在某一位置中,以此来实现无论执行任何模板都可以直接选择存储的参数,不需要再次查询。​

在OOS中使用

OOS提供公共参数,相比较普通参数由用户自己创建和管理,公共参数由阿里云统一管理,用户可以直接使用。比如最新的系统镜像参数,以ECS所有最新的镜像为例:

image.png

比如,用户希望自己创建镜像时永远使用最新的centos8版本。如果不使用公共参数,那用户必须自己手动去查找当前最新的镜像,如centos_8_5_x64_20G_alibase_20220428.vhd,然后填入。

如果使用公共参数,用户可在OOS模板中直接引用镜像的公共参数,如以下模板,参数latestCentos8ImageId会用来接收用户传入的最新cenos8的公共参数。后续在latestCentos8ImageId参数部分填入公共参数名称即可,不需要用户自己去查找具体镜像的id,维护工作由阿里云完成。比如这里填入aliyun/services/ecs/images/linux/almalinux-latest/almalinux_9_2_x64,系统会自动解析最新的centos8的具体镜像。

Description: Example template, run instance
FormatVersion: OOS-2019-06-01
Parameters:
  latestCentos8ImageId:
    Type: String
  regionId:
    Type: String
    Label:
      en: RegionId
      zh-cn: 地域ID
    AssociationProperty: RegionId
    Default: '{{ ACS::RegionId }}'
  instanceType:
    Label:
      en: InstanceType
      zh-cn: 实例类型
    Type: String
    AssociationProperty: ALIYUN::ECS::Instance::InstanceType
    AssociationPropertyMetadata:
      RegionId: regionId
  securityGroupId:
    Label:
      en: SecurityGroupId
      zh-cn: 安全组ID
    Type: String
    AssociationProperty: ALIYUN::ECS::SecurityGroup::SecurityGroupId
    AssociationPropertyMetadata:
      RegionId: regionId
  vSwitchId:
    Label:
      en: VSwitchId
      zh-cn: 交换机ID
    Type: String
    AssociationProperty: ALIYUN::VPC::VSwitch::VSwitchId
    AssociationPropertyMetadata:
      RegionId: regionId
      Filters:
        - SecurityGroupId: securityGroupId
Tasks:
  - Name: runInstances
    Action: ACS::ECS::RunInstances
    Description:
      en: Creates one or more ECS instances.
      zh-cn: 创建实例。
    Properties:
      imageId: '{{ latestCentOS8ImageId }}'
      instanceType: '{{ instanceType }}'
      securityGroupId: '{{ securityGroupId }}'
      vSwitchId: '{{ vSwitchId }}'
      amount: 1
    Outputs:
      instanceId:
        ValueSelector: instanceIds[0]
        Type: String

具体填写方法:

在控制台,用户可以按照OOS公共参数的格式,手动填写。具体格式为 {{oos:公共参数名称}}, 如{{oos:aliyun/services/ecs/images/linux/almalinux-latest/almalinux_9_2_x64}}。

另外,控制台也支持单击右边的加号按钮,查询希望的公共参数。

截屏2023-05-12 11.48.30.png

您也可以直接在模板中按照格式写入公共参数,如:

Description: Example template, run instance
FormatVersion: OOS-2019-06-01
Parameters:
  regionId:
    Type: String
    Label:
      en: RegionId
      zh-cn: 地域ID
    AssociationProperty: RegionId
    Default: '{{ ACS::RegionId }}'
  instanceType:
    Label:
      en: InstanceType
      zh-cn: 实例类型
    Type: String
    AssociationProperty: ALIYUN::ECS::Instance::InstanceType
    AssociationPropertyMetadata:
      RegionId: regionId
  securityGroupId:
    Label:
      en: SecurityGroupId
      zh-cn: 安全组ID
    Type: String
    AssociationProperty: ALIYUN::ECS::SecurityGroup::SecurityGroupId
    AssociationPropertyMetadata:
      RegionId: regionId
  vSwitchId:
    Label:
      en: VSwitchId
      zh-cn: 交换机ID
    Type: String
    AssociationProperty: ALIYUN::VPC::VSwitch::VSwitchId
    AssociationPropertyMetadata:
      RegionId: regionId
      Filters:
        - SecurityGroupId: securityGroupId
Tasks:
  - Name: runInstances
    Action: ACS::ECS::RunInstances
    Description:
      en: Creates one or more ECS instances.
      zh-cn: 创建实例。
    Properties:
      imageId: '{{oos:aliyun/services/ecs/images/linux/almalinux-latest/almalinux_9_2_x64}}'
      instanceType: '{{ instanceType }}'
      securityGroupId: '{{ securityGroupId }}'
      vSwitchId: '{{ vSwitchId }}'
      amount: 1
    Outputs:
      instanceId:
        ValueSelector: instanceIds[0]
        Type: String

在ROS中使用

同样,依据ROS模板的语法,也可以在ROS中引用公共参数,比如可以在imageId参数这里填入aliyun/services/ecs/centos-latest/centos_8_5_64以引用centos8的最新镜像

ROSTemplateFormatVersion: '2015-09-01'
Parameters:
  InstanceType:
    Type: String
    Default: ECS.c6.large
  ImageId:
    Type: 'ALIYUN::OOS::Parameter::Value'
    Default: aliyun/services/ecs/centos-latest/centos_8_5_64
  SecurityGroupId:
    Type: String
    AssociationProperty: 'ALIYUN::ECS::SecurityGroup::SecurityGroupId'
    AssociationPropertyMetadata:
      VpcId: '${VpcId}'
  VpcId:
    Type: String
    AssociationProperty: 'ALIYUN::ECS::VPC::VPCId'
    AssociationPropertyMetadata:
      RegionId: '${RegionId}'
Resources:
  ECS:
    Type: 'ALIYUN::ECS::InstanceGroup'
    Properties:
      ImageId:
        Ref: ImageId
      InstanceType:
        Ref: InstanceType
      MaxAmount: 1
      SecurityGroupId:
        Ref: SecurityGroupId
      VpcId:
        Ref: VpcId
      NetworkType: vpc
Outputs:
  InstanceIds:
    Value:
      'Fn::GetAtt':
        - ECS
        - InstanceIds

控制台的imageId这里,直接填入公共参数的名称

截屏2023-05-12 14.01.27.png

ROS也支持在Resources里面引用公共参数

按照格式{{resolve:oos:公共参数名称}}

比如这里imageId填写{{resolve:oos:aliyun/services/ecs/centos-latest/centos_8_5_64}}

ROSTemplateFormatVersion: '2015-09-01'
Parameters:
  InstanceType:
    Type: String
    Default: ECS.c6.large
  SecurityGroupId:
    Type: String
    AssociationProperty: 'ALIYUN::ECS::SecurityGroup::SecurityGroupId'
    AssociationPropertyMetadata:
      VpcId: '${VpcId}'
  VpcId:
    Type: String
    AssociationProperty: 'ALIYUN::ECS::VPC::VPCId'
    AssociationPropertyMetadata:
      RegionId: '${RegionId}'
Resources:
  ECS:
    Type: 'ALIYUN::ECS::InstanceGroup'
    Properties:
      ImageId: '{{resolve:oos:aliyun/services/ecs/centos-latest/centos_8_5_64}}'
      InstanceType:
        Ref: InstanceType
      MaxAmount: 1
      SecurityGroupId:
        Ref: SecurityGroupId
      VpcId:
        Ref: VpcId
      NetworkType: vpc
Outputs:
  InstanceIds:
    Value:
      'Fn::GetAtt':
        - ECS
        - InstanceIds