模板用于创建资源栈,是描述基础设施和架构的蓝图。您需要在模板中声明各类云服务的资源,然后通过ROS部署资源。

背景信息

当您了解ROS的模板结构后,可以尝试编写您的第一个模板。关于模板结构的更多信息,请参见模板结构说明

本文从简入难,为您介绍如何编写和测试一个简单的模板(创建VPC),然后深入讲解如何在模板中定义多个资源及其依赖关系、在模板中定义参数,从而满足您在多个部署场景的需求,具体如下:

编写模板

编写模板最为重要的部分是在资源(Resources)中声明需要创建的资源,您可以在资源类型索引中查看ROS支持的所有资源类型,然后单击特定资源类型查看该资源类型支持的属性和返回值信息。

  1. 根据部署场景查询资源类型详情。
    1. 访问资源类型索引,根据部署场景查询资源类型(例如:创建VPC需要用到资源类型ALIYUN::ECS::VPC)。
    2. 访问指定资源类型(例如:ALIYUN::ECS::VPC),查询属性详情。
      资源类型文档中为每个属性定义了“类型”、“必须”、“允许更新”、“描述”、“约束”等信息,其中:
      • 若“必须”为是,则要求必须在模板Resources的Properties中声明该属性;反之,则选填。
      • 若“允许更新”为是,则意味着新模板中可以修改此属性,再使用新模板去更新资源栈以达到更新云资源属性的目的;反之,则不允许更新。
  2. 资源(Resources)中声明需要创建的资源。
    您可以定义专有网络名称(VpcName)和专有网络网段(CidrBlock),编写Resources模板示例代码段。
    "Resources": {
        "VPC": {
          "Type": "ALIYUN::ECS::VPC",
          "Properties": {
            "VpcName": "myvpc",
            "CidrBlock": "192.168.0.0/16"
          }
        }
      }
  3. 输出(Outputs)中定义使用模板创建资源栈后的输出内容。
    您可以定义专有网络ID(VpcId),编写Outputs模板示例代码段。
    "Outputs": {
        "VpcId": {
          "Value": { "Ref": "VPC" }
        },
        "VRouterId": {
          "Value": { "Fn::GetAtt": ["VPC", "VRouterId"] }
        }
      }
  4. 根据模板结构,编写完整的模板。
    更多信息,请参见模板结构说明

    创建VPC的完整模板示例代码如下:

    {
      "ROSTemplateFormatVersion": "2015-09-01",
      "Resources": {
        "VPC": {
          "Type": "ALIYUN::ECS::VPC",
          "Properties": {
            "VpcName": "myvpc",
            "CidrBlock": "192.168.0.0/16"
          }
        }
      },
      "Outputs": {
        "VpcId": {
          "Value": { "Ref": "VPC" }
        },
        "VRouterId": {
          "Value": { "Fn::GetAtt": ["VPC", "VRouterId"] }
        }
      }
    }

测试模板

编写模板完成后,您可以使用模板创建资源栈,测试通过该模板是否可以创建预期的资源。

  1. 登录资源编排控制台
  2. 创建资源栈。
    1. 在左侧导航栏,单击资源栈
    2. 在页面左上角的地域下拉列表,选择资源栈的所在地域,例如:华北2(北京)。
    3. 资源栈列表页面,单击创建资源栈,然后在下拉列表中选择使用新资源(标准)
    4. 选择模板页面,在指定模板区域单击选择已有模板、选择模板录入方式输入模板,然后在模板内容区域的ROS页签输入编写模板章节中编写的JSON格式的模板,最后单击下一步
    5. 配置模板参数页面,输入资源栈名称,然后单击下一步
    6. 配置资源栈页面,配置资源栈策略失败时回滚超时设置删除保护RAM角色标签资源组,然后单击下一步
    7. 检查并确认页面,单击预览模板资源,然后在预览对话框查看经过ROS校验的模板中的资源名称、资源类型和资源属性,最后单击确定
    8. 检查并确认页面,单击创建
  3. 查看资源栈。
    1. 在资源栈管理页面,单击事件页签,查看模板中不同资源的事件列表。
      事件
    2. 单击资源页签,查看已创建的资源详情。
      说明 您也可以单击模板资源ID,然后在资源相应的控制台查看更多资源信息,进一步确认资源是否符合预期。
      资源
    3. 单击输出页签,查看在模板Outputs中定义的输出。
      输出

在模板中定义多个资源及其依赖关系

了解如何编写基础的VPC资源相关模板后,您可能需要根据实际部署场景定义多个资源,以及资源之间的依赖关系。例如:交换机vSwitch依赖于VPC,您需要在特定的VPC中创建vSwitch。通过模板定义VPC、vSwitch资源及其依赖关系,然后创建资源栈,可以满足更为复杂的部署场景。

  1. 使用Fn::GetAtt函数获取资源输出属性值。
    例如:假设Resources中定义了VPC,可以通过{"Fn::GetAtt": ["VPC", "VpcId"]}获取VPC资源的输出属性VpcId。
  2. 使用Ref函数获取资源ID或参数值。
    例如:假设Resources中定义了VPC,可以通过{"Ref": "VPC"}引用VPC资源ID。
    说明
    • {"Ref": "VPC"}{"Fn::GetAtt": ["VPC", "VpcId"]}作用相同,但前者更为便捷。
    • Ref和Fn::GetAtt函数隐式声明了资源间的依赖关系,您也可以通过DependsOn属性显式声明资源间的依赖关系。
  3. 优化模板。
    以下模板示例,新增声明一个vSwitch,其可用区为cn-beijing-f、名称为myvsw、CidrBlock为192.168.0.0/24,并引用VPC。此外,在Outputs中定义了vSwitch的输出为交换机ID。
    {
      "ROSTemplateFormatVersion": "2015-09-01",
      "Resources": {
        "VPC": {
          "Type": "ALIYUN::ECS::VPC",
          "Properties": {
            "VpcName": "myvpc",
            "CidrBlock": "192.168.0.0/16"
          }
        },
        "VSwitch": {
          "Type": "ALIYUN::ECS::VSwitch",
          "Properties": {
            "VpcId": { "Ref": "VPC" },
            "ZoneId": "cn-beijing-f",
            "VSwitchName": "myvsw",
            "CidrBlock": "192.168.0.0/24"
          }
        }
      },
      "Outputs": {
        "VpcId": {
          "Value":  "Fn::GetAtt": ["VPC", "VpcId"] }
        },
        "VRouterId": {
          "Value": { "Fn::GetAtt": ["VPC", "VRouterId"] }
        },
        "VSwitchId": {
          "Value": { "Ref": "VSwitch" }
        }
      }
    }

在模板中定义参数取值和参数属性

参数(Parameters)可以提高模板的灵活性和可复用性,您可以通过定义参数取值和参数属性实现动态展示参数取值列表、为参数分组等需求,具体如下:

  • 定义参数

    在模板中为资源属性指定固定值的方式比较便捷,但是不够灵活。例如:ZoneId为cn-beijing-f,只能在北京地域创建资源栈,如果要更换地域需手动修改模板中的ZoneId取值。此时您可以将常用的或共同的属性提取出来定义为参数,以便在不修改模板的前提下,通过指定不同的参数来创建不同属性的资源。模板中定义的参数和模板示例代码如下:

    • 模板中定义的多个参数
      参数 说明
      ZoneId 被vSwitch的ZoneId属性引用。
      VpcCidrBlock 默认值为192.168.0.0/16,被VPC的CidrBlock属性引用。
      VSwitchCidrBlock 默认值为192.168.0.0/24,被vSwitch的CidrBlock属性引用
    • 模板示例代码
      {
        "ROSTemplateFormatVersion": "2015-09-01",
        "Parameters": {
          "ZoneId": {
            "Type": "String"
          },
          "VpcCidrBlock": {
            "Type": "String",
            "Default": "192.168.0.0/16"
          },
          "VSwitchCidrBlock": {
            "Type": "String",
            "Default": "192.168.0.0/24"
          }
        },
        "Resources": {
          "VPC": {
            "Type": "ALIYUN::ECS::VPC",
            "Properties": {
              "VpcName": "myvpc",
              "CidrBlock": { "Ref": "VpcCidrBlock" }
            }
          },
          "VSwitch": {
            "Type": "ALIYUN::ECS::VSwitch",
            "Properties": {
              "VpcId": { "Ref": "VPC" },
              "ZoneId": { "Ref": "ZoneId" },
              "VSwitchName": "myvsw",
              "CidrBlock": { "Ref": "VSwitchCidrBlock" }
            }
          }
        },
        "Outputs": {
          "VpcId": {
            "Value": { "Ref": "VPC" }
          },
          "VRouterId": {
            "Value": { "Fn::GetAtt": ["VPC", "VRouterId"] }
          },
          "VSwitchId": {
            "Value": { "Ref": "VSwitch" }
          }
        }
      }

      使用模板示例代码创建资源栈时,您可以在资源编排控制台根据需要灵活设置参数取值。

      定义参数

      其中,ROS将分析模板中参数和资源属性的关联关系,获取参数的取值范围。例如:模板中的ZoneId参数关联了vSwitch资源的ZoneId属性,ROS将获取支持vSwitch的可用区列表,并在控制台展示。

      ZoneID
  • 动态设置取值列表

    参数(Parameters)支持多个属性,您可以通过定义属性,在控制台灵活呈现参数属性及取值。模板中定义的参数属性和模板示例代码如下:

    • 参数中定义的多个属性
      属性 说明
      AllowedValues 定义取值列表,ROS控制台会为参数显示该列表。例如:VpcCidrBlock取值为10.0.0.0/8、172.16.0.0/12和192.168.0.0/16。
      Label 定义参数别名,ROS控制台将显示此别名。例如:ZoneId显示为可用区ID。
    • 模板示例代码
      {
        "ROSTemplateFormatVersion": "2015-09-01",
        "Parameters": {
          "ZoneId": {
            "Type": "String",
            "Label": "可用区ID"
          },
          "VpcCidrBlock": {
            "Type": "String",
            "Label": "专有网络CIDR",
            "Default": "192.168.0.0/16",
            "AllowedValues": ["10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16"]
          },
          "VSwitchCidrBlock": {
            "Type": "String",
            "Label": "交换机CIDR",
            "Default": "192.168.0.0/24"
          }
        }
      }
      使用模板示例代码创建资源栈时,您可以在资源编排控制台直接选择参数取值。参数值
  • 基于参数关联关系动态呈现参数

    定义参数的关联属性(AssociationProperty和AssociationPropertyMetadata)后,ROS控制台将动态查询参数的取值列表。更多信息,请参见AssociationProperty和AssociationPropertyMetadata

    例如:假设模板中要创建ECS实例,其VpcId和vSwitchId作为参数传入,ROS控制台可以自动显示VpcId和vSwitchId的取值下拉列表。模板示例代码如下:

    {
      "ROSTemplateFormatVersion": "2015-09-01",
      "Parameters": {
        "VpcId": {
          "Type": "String",
          "AssociationProperty": "ALIYUN::ECS::VPC::VPCId"
        },
        "ZoneId": {
          "Type": "String",
          "AssociationProperty": "ALIYUN::ECS::ZoneId"
        },
        "VSwitchId": {
          "Type": "String",
          "AssociationProperty": "ALIYUN::ECS::VSwitch::VSwitchId",
          "AssociationPropertyMetadata": {
            "ZoneId": "${ZoneId}",
            "VpcId": "${VpcId}"
          }
        }
      }
    }

    使用模板示例代码创建资源栈时,您可以在资源编排控制台将动态呈现参数。

    动态展示参数
  • 集中设置同类参数

    元数据(Metadata)支持为参数分组。当模板中的参数较多时,可以根据参数的特征为其分组,以便在控制台集中配置参数。

    例如:将模板中的ZoneId、VpcCidrBlock、VSwitchCidrBlock参数分组到基础设置和资源设置,其中基础设置为ZoneId,资源设置为VpcCidrBlock、VSwitchCidrBlock。您可以在Metadata的ParameterGroups中定义这两个分组。模板示例代码如下:

    {
      "ROSTemplateFormatVersion": "2015-09-01",
      "Parameters": {
        "ZoneId": {
          "Type": "String"
        },
        "VpcCidrBlock": {
          "Type": "String",
          "Default": "192.168.0.0/16"
        },
        "VSwitchCidrBlock": {
          "Type": "String",
          "Default": "192.168.0.0/24"
        }
      },
      "Metadata": {
        "ALIYUN::ROS::Interface": {
          "ParameterGroups": [
            {
              "Parameters": ["ZoneId"],
              "Label": {
                "default": "基础设置"
              }
            },
            {
              "Parameters": ["VpcCidrBlock", "VSwitchCidrBlock"],
              "Label": {
                "default": "资源设置"
              }
            }
          ]
        }
      }
    }

    使用模板示例代码创建资源栈时,您可以在资源编排控制台的基础设置和资源设置分组中集中设置参数。

    参数分组