IT管理员可以通过服务目录创建和发布满足企业合规要求的产品,用户在启动产品的时候需要遵循一定的规则。同时服务目录也支持开放部分模板参数,让用户自行填写,帮助企业在合规与敏捷之间寻找一个平衡点。
接下来我们通过几个例子,向读者展示如何通过服务目录快速定制参数表单。
例1:将模板参数开放给用户填写
在Terraform模板中定义Variable(变量)的方式可以参考Terraform官方文档。
以下面的模板为例,该模板会在当前账号下创建一个RAM角色,角色名称可以通过变量的方式由用户输入。
data "alicloud_caller_identity""current" { } resource"alicloud_ram_role""default" { name = var.role_name document =<<EOF { "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "RAM": [ "acs:ram::${data.alicloud_caller_identity.current.account_id}:root" ] } } ], "Version": "1" } EOF description ="created by terraform" force = true } variable"role_name" { type =string description ="RAM角色名称"}
如果是在本地通过CLI运行Terraform模板,可以通过CLI命令的参数、环境变量、配置文件等方式传入变量值;通过服务目录在线运行,则是用户在页面上填写表单的方式传入变量值。
用户填写参数后启动产品,可以看到Terraform模板的输出值,在RAM控制台上也可以确认新创建的RAM角色的信息。
例2:限定ECS实例规格(参数选项)
下面是第二个例子,该模板会在指定的可用区创建一台ECS,并且将实例规格开放给用户选择。如果只能输入字符串,而不是从给定的选项中选择,会存在两个问题:
- 用户需要从ECS控制台或者文档中找到类似于“ecs.s6-c1m1.small”的实例规格;
- 用户可以填写任意的规格。
服务目录底层基于ROS运行Terraform模板,支持在Terraform模板中补充ROS的参数定义,以扩展参数在页面表单上的展示和行为。
在这个例子中,我们在instance_type这个变量的description字段中使用了ROS的语法,AllowedValues表示变量的可选值,Label表示页面表单中的变量名称,Description表示备注。
resource"alicloud_instance""instance" { availability_zone ="cn-hangzhou-h" security_groups = alicloud_security_group.group.*.id instance_type = var.instance_type system_disk_category ="cloud_efficiency" system_disk_name ="test_system_disk_name" system_disk_description ="test_system_disk_description" image_id ="ubuntu_18_04_64_20G_alibase_20190624.vhd" instance_name ="test_instance" vswitch_id ="vsw-bp1v8vk0cnokddgmmxxxx" internet_max_bandwidth_out =10} variable"instance_type" { type =string description =<<EOT { "AllowedValues": ["ecs.s6-c1m1.small", "ecs.s6-c1m2.small", "ecs.s6-c1m2.large", "ecs.s6-c1m2.xlarge", "ecs.s6-c1m2.2xlarge"], "Description": "请选择ECS实例规格", "Label": "ECS实例规格" } EOT }
用户看到的页面表单如下图所示。
例3:选择账号中已有的VPC和VSwitch(动态参数选项)
例2中的选项是固定的,这对于ECS实例规格可能已经足够了,但如果是要选择账号中已有的VPC和VSwitch,管理员就需要把VPC和VSwitch的ID都记录下来,并且当出现新的VPC后,还要重新修改模板,添加可选值。
resource"alicloud_instance""instance" { availability_zone = var.zone_id security_groups = alicloud_security_group.group.*.id instance_type = var.instance_type system_disk_category ="cloud_efficiency" system_disk_name ="test_system_disk_name" system_disk_description ="test_system_disk_description" image_id ="ubuntu_18_04_64_20G_alibase_20190624.vhd" instance_name ="test_instance" vswitch_id = var.vswitch_Id internet_max_bandwidth_out =10} variable"zone_id" { type =string description =<<EOT { "AssociationProperty": "ALIYUN::ECS::Instance::ZoneId", "Type": "String", "Description": { "zh-cn": "可用区配置决定了新建ECS实例的可用区。此外,如果您选择已有基础资源配置,仅能选到该可用区下的交换机。", "en": "ECS VSwitch Zone ID defines the Availability Zone for creating ECS instance. If you choose existing Infrastructure Configuration,you can only find the VSwitch under the availabilty zone." }, "Label": { "zh-cn": "可用区", "en": "ECS VSwitch Zone ID" } } EOT } variable"vpc_id" { type =string description =<<EOT { "AssociationProperty": "ALIYUN::ECS::VPC::VPCId", "Label": "VPC" } EOT } variable"vswitch_Id" { type =string description =<<EOT { "AssociationProperty": "ALIYUN::ECS::VSwitch::VSwitchId", "AssociationPropertyMetadata": { "ZoneId": "$${zone_id}", "VpcId": "$${vpc_id}" }, "Label": "VSwitch" } EOT } variable"instance_type" { type =string description =<<EOT { "AssociationProperty": "ALIYUN::ECS::Instance::InstanceType", "AssociationPropertyMetadata": { "ZoneId": "$${zone_id}" }, "Label": { "zh-cn": "实例规格", "en": "Instance Type" } } EOT }
可以通过动态参数选项来解决这个问题,在这个例子中,我们定义了四个参数,分别是zone_id(可用区)、vpc_id(VPC ID)、vswitch_id(VSwitch ID)和instance_type(ECS实例规格)。AssociationProperty是动态参数引用的参数类型,AssociationPropertyMetadata是筛选条件(可选),页面会根据参数类型,实时获取账号中对应的资源列表,作为参数的选项。例如根据当前选择的地域,列出该地域下的VPC列表,当用户选择VPC和可用区后,再列出对应的VSwitch列表,供用户选择。
动态参数选项同时也可以实现选项的可视化,达到类似于云产品控制台的效果。
这些参数最终会被应用到模板中。
当前支持的动态参数选项可以参考相关文档。
例4:参数分组
下面的例子中,我们有网络相关的参数vpc_id、vswitch_id,也有ECS相关的参数instance_type,当参数比较多时,可以使用.metadata文件对参数进行分组,也可以在分组内对参数进行排序。
文件结构
│─ .metadata // 元数据文件
│─ main.tf // Terraform模板文件(主体)
└─ variables.tf // Terraform模板文件(变量部分)
.metadata文件
{ "ALIYUN::ROS::Interface": { "ParameterGroups": [ { "Parameters": [ "zone_id" ], "Label": { "default": { "en": "Basic Configuration Settings", "zh-cn": "基础设置" } } }, { "Parameters": [ "vpc_id", "vswitch_id" ], "Label": { "default": { "en": "Network Configuration Settings", "zh-cn": "网络设置" } } }, { "Parameters": [ "instance_type" ], "Label": { "default": { "en": "ECS Configuration Settings", "zh-cn": "ECS设置" } } } ] } }
用户看到的页面表单如下图所示。