基于Mappings自动化配置yum源
1. 编写ROS模板
模板语法
映射(mappings)是一个Key-Value映射表,其中Key和Value可以为字符串类型或者数字类型。如果声明多个映射,用英文逗号(,)分隔。每个映射的名称不能重复。在模板的Resources和Outputs中,可以使用Fn::FindInMap内部函数,通过指定Key而获取映射表的Value。
映射代码示例:
"Mappings": { "ValidMapping": { "TestKey1": {"TestValu1": "value1"}, "TestKey2": {"TestValu2": "value2"}, 1234567890: {"TestValu3": "value3"}, "TestKey4": {"TestValu4": 1234} } }
内部函数Fn::FindInMap返回与Mappings声明的双层映射中的键对应的值。
声明
"Fn::FindInMap": ["MapName", "TopLevelKey", "SecondLevelKey"]
参数
MapName:Mappings中所声明映射的ID,包含键和值。
TopLevelKey:第一级键,其值是一个键/值对列表。
SecondLevelKey:第二级键,其值是一个字符串或者数字。
返回值
分配给SecondLevelKey的值。
示例
在创建名为WebServer的资源时,需要指定ImageId属性。在Mappings中,描述根据区域区分的ImageId映射。在Parameters中,描述需要用户指定的区域。Fn::FindInMap会根据用户指定的区域,在RegionMap中查找对应的ImageId映射,然后在映射中找到对应的ImageId。
MapName可按照个人意愿设置。在本示例中为"RegionMap"。
TopLevelKey设置为创建资源栈的地区。在本示例中,通过{"Ref" : "regionParam"}确定。
SecondLevelKey设置为所需的架构。在本示例中为"32"。
{ "ROSTemplateFormatVersion": "2015-09-01", "Parameters": { "regionParam": { "Description": "选择创建ECS的区域", "Type": "String", "AllowedValues": [ "hangzhou", "beijing" ] } }, "Mappings": { "RegionMap": { "hangzhou": { "32": "m-25l0rcfjo", "64": "m-25l0rcfj1" }, "beijing": { "32": "m-25l0rcfj2", "64": "m-25l0rcfj3" } } }, "Resources": { "WebServer": { "Type": "ALIYUN::ECS::Instance", "Properties": { "ImageId": { "Fn::FindInMap": [ "RegionMap", {"Ref": "regionParam"}, "32" ] }, "InstanceType": "ecs.t1.small", "SecurityGroupId": "sg-25zwc****", "ZoneId": "cn-beijing-b", "Tags": [ { "Key": "key1", "Value": "value1" }, { "Key": "key2", "Value": "value2" } ] } } } }
支持的函数
Fn::FindInMap
Ref
模板说明
模板中定义了mappings:{...}对象内容,记录多个CentOS系统版本对应的阿里yum源地址。在创建ECS进行系统初始化操作时,Fn::FindInMap函数会根据所选择镜像参数(InstanceImageId)的版本匹配对应的yum源,然后完成yum源的替换。
声明创建的资源(Resources)
示例代码段如下:
{ "ROSTemplateFormatVersion": "2015-09-01", "Description": "Creates ECS Centos system instance, and set yum repo.", "Metadata": { "ALIYUN::ROS::Interface": { "ParameterGroups": [ { "Parameters": [ "VSwitchZoneId", "InstanceImageId", "InstanceType", "SystemDiskSize", "InstancePublicIP", "InstancePassword", "SystemDiskCategory" ], "Label": { "default": "ECS" } } ], "TemplateTags": [ "acs:example:云起实验室:基于Mappings自动化配置yum源" ] } }, "Parameters": { "SystemDiskCategory": { "Type": "String", "Label": { "en": "System Disk Type", "zh-cn": "系统盘类型" }, "Description": { "en": "<font color='blue'><b>Optional values:</b></font><br>[cloud_efficiency: <font color='green'>Efficient Cloud Disk</font>]<br>[cloud_ssd: <font color='green'>SSD Cloud Disk</font>]<br>[cloud_essd: <font color='green'>ESSD Cloud Disk</font>]<br>[cloud: <font color='green'>Cloud Disk</font>]<br>[ephemeral_ssd: <font color='green'>Local SSD Cloud Disk</font>]", "zh-cn": "<font color='blue'><b>可选值:</b></font><br>[cloud_efficiency: <font color='green'>高效云盘</font>]<br>[cloud_ssd: <font color='green'>SSD云盘</font>]<br>[cloud_essd: <font color='green'>ESSD云盘</font>]<br>[cloud: <font color='green'>普通云盘</font>]<br>[ephemeral_ssd: <font color='green'>本地SSD盘</font>]" }, "AllowedValues": [ "cloud_efficiency", "cloud_ssd", "cloud", "cloud_essd", "ephemeral_ssd" ], "Default": "cloud_ssd" }, "InstanceImageId": { "Type": "String", "Default": "centos_7", "AllowedValues": [ "centos_6", "centos_7", "centos_8" ], "Description": { "zh-cn": "镜像ID, 支持选择 [centos_6,centos_7,centos_8]", "en": "Image ID,support [centos_6,centos_7,centos_8]" }, "Label": { "zh-cn": "镜像", "en": "Image" } }, "InstanceType": { "Type": "String", "Description": { "zh-cn": "填写VSwitch可用区下可使用的规格;<br>通用规格:<font color='red'><b>ecs.c5.large</b></font><br>注:可用区可能不支持通用规格<br>规格详见:<a href='https://help.aliyun.com/document_detail/25378.html' target='_blank'><b><font color='blue'>实例规格族</font></a></b>", "en": "Fill in the specifications that can be used under the VSwitch availability zone;</b></font><br>general specifications:<font color='red'><b>ecs.c5.large</b></font><br>note: a few zones do not support general specifications<br>see detail: <a href='https://www.alibabacloud.com/help/en/doc-detail/25378.html' target='_blank'><b><font color='blue'>Instance Specification Family</font></a></b>" }, "Label": { "zh-cn": "实例规格", "en": "Instance Type" }, "AssociationProperty": "ALIYUN::ECS::Instance::InstanceType", "AssociationPropertyMetadata": { "ZoneId": "VSwitchZoneId" } }, "InstancePassword": { "NoEcho": true, "Type": "String", "Description": { "en": "Server login password, Length 8-30, must contain three(Capital letters, lowercase letters, numbers, ()`~!@#$%^&*_-+=|{}[]:;'<>,.?/ Special symbol in).", "zh-cn": "服务器登录密码。长度为8~30个字符,必须包含大写英文字母、小写英文字母、数字和特殊字符(`()~!@#$%^&*_-+=|{}[]:;'<>,.?/)中的三项。" }, "AllowedPattern": "[0-9A-Za-z\\_\\-\\&:;'<>,=%`~!@#\\(\\)\\$\\^\\*\\+\\|\\{\\}\\[\\]\\.\\?\\/]+$", "Label": { "en": "Instance Password", "zh-cn": "实例密码" }, "ConstraintDescription": { "en": "Length 8-30, must contain three(Capital letters, lowercase letters, numbers, ()`~!@#$%^&*_-+=|{}[]:;'<>,.?/ Special symbol in).", "zh-cn": "长度为8~30个字符,必须包含大写英文字母、小写英文字母、数字和特殊字符(`()~!@#$%^&*_-+=|{}[]:;'<>,.?/)中的三项。" }, "MinLength": 8, "MaxLength": 30 }, "InstancePublicIP": { "Type": "Boolean", "Description": { "zh-cn": "是否分配公共IP。", "en": "Whether to assign a common IP." }, "Label": { "zh-cn": "分配公网IP", "en": "Allocate Public IP" }, "Default": false }, "VSwitchZoneId": { "AssociationProperty": "ALIYUN::ECS::Instance:ZoneId", "Type": "String", "Description": { "zh-cn": "可用区ID。<br><b>注: <font color='blue'>选择前请确认该可用区是否支持创建ECS资源的规格,建议设置与其他交换机不同的可用区</font></b>", "en": "Availability Zone ID.<br><b>note:<font color='blue'>before selecting, please confirm that the Availability Zone supports the specification of creating ECS resources,which is recommended to be different from other VSwitch Availability Zone</font></b>" }, "Label": { "zh-cn": "交换机可用区", "en": "VSwitch Availability Zone" } }, "SystemDiskSize": { "Default": 40, "Type": "Number", "Description": { "zh-cn": "系统盘大小, 取值范围:40~500, 单位:GB。", "en": "System disk size, range of values: 40-500, units: GB." }, "Label": { "zh-cn": "系统盘空间", "en": "System Disk Space" } } }, "Mappings": { "YumMap": { "centos_6": { "YumSource": "http://mirrors.aliyun.com/repo/Centos-6.repo" }, "centos_7": { "YumSource": "http://mirrors.aliyun.com/repo/Centos-7.repo" }, "centos_8":{ "YumSource": "http://mirrors.aliyun.com/repo/Centos-8.repo" } } }, "Resources": { "RosConditionHandle": { "Type": "ALIYUN::ROS::WaitConditionHandle" }, "RosWaitCondition": { "Type": "ALIYUN::ROS::WaitCondition", "DependsOn": "EcsInstance", "Properties": { "Timeout": 1800, "Count": 1, "Handle": { "Ref": "RosConditionHandle" } } }, "EcsVSwitch": { "Type": "ALIYUN::ECS::VSwitch", "Properties": { "VpcId": { "Ref": "EcsVpc" }, "ZoneId": { "Ref": "VSwitchZoneId" }, "CidrBlock": "192.168.0.0/24" } }, "EcsInstance": { "Type": "ALIYUN::ECS::Instance", "Properties": { "UserData": { "Fn::Replace": [ { "ros-notify": { "Fn::GetAtt": [ "RosConditionHandle", "CurlCli" ] } }, { "Fn::Join": [ "", [ "#!/bin/bash \n", "yum_repo=", { "Fn::FindInMap": [ "YumMap", { "Ref": "InstanceImageId" }, "YumSource" ] }, "\n", "mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup\n", "curl -o /etc/yum.repos.d/CentOS-Base.repo $yum_repo \n", "yum clean all \n", "yum makecache \n", "ros-notify -d '{\"data\" : \"Install Centos success.\"}'\n" ] ] } ] }, "IoOptimized": "optimized", "PrivateIpAddress": "192.168.0.1", "VpcId": { "Ref": "EcsVpc" }, "SecurityGroupId": { "Ref": "EcsSecurityGroup" }, "VSwitchId": { "Ref": "EcsVSwitch" }, "ImageId": { "Ref": "InstanceImageId" }, "AllocatePublicIP": { "Ref": "InstancePublicIP" }, "InstanceType": { "Ref": "InstanceType" }, "SystemDiskSize": { "Ref": "SystemDiskSize" }, "SystemDiskCategory": { "Ref": "SystemDiskCategory" }, "Password": { "Ref": "InstancePassword" } } }, "EcsSecurityGroup": { "Type": "ALIYUN::ECS::SecurityGroup", "Properties": { "VpcId": { "Ref": "EcsVpc" }, "SecurityGroupIngress": [ { "PortRange": "-1/-1", "Priority": 1, "SourceCidrIp": "0.0.0.0/0", "IpProtocol": "all", "NicType": "intranet" } ], "SecurityGroupEgress": [ { "PortRange": "-1/-1", "Priority": 1, "IpProtocol": "all", "DestCidrIp": "0.0.0.0/0", "NicType": "intranet" } ] } }, "EcsVpc": { "Type": "ALIYUN::ECS::VPC", "Properties": { "CidrBlock": "192.168.0.0/16", "VpcName": { "Fn::Join": [ "-", [ "StackId", { "Ref": "ALIYUN::StackId" } ] ] } } } }, "Outputs": { "EcsInstanceId": { "Value": { "Fn::GetAtt": [ "EcsInstance", "InstanceId" ] } } } }
2. 创建资源栈
以下操作需登录阿里云账号,在资源编排控制台完成以下操作流程。
访问资源编排控制台
1. 进入资源编排控制台。
访问资源栈页面
2. 在资源编排控制台左侧导航栏中单机资源栈。
选择资源创建地域
3. 在页面左上角的地域下拉列表,选择资源栈的所在地域(例如:华北2:北京)。
创建资源栈
4. 在资源栈列表页面,单击创建资源栈,然后在下拉列表中选择使用新资源(标准)。
输入模板
5. 在选择模板页面,选择已有模板:选择输入模板方式,然后将上述示例模板内容复制到模板内容输入框内。然后单击下一步。
模板参数配置
6. 在配置模板参数页面,配置资源栈名称及其余参数,然后单击下一步。
参数配置
参数 |
说明 |
交换机可用区 |
资源所属的可用区。 |
镜像 |
ECS实例的镜像ID。 默认值:centos_7。 更多信息,请参见镜像概述。 |
实例规格 |
ECS实例规格。 请选用有效的实例规格。更多信息,请参见实例规格族。 |
系统盘空间 |
ECS实例的系统盘空间。 取值范围:40~500。 单位:GB。 |
分配公网IP |
是否为ECS实例分配公网地址。
|
实例密码 |
ECS实例登录密码。 |
系统盘类型 |
ECS实例的系统盘规格。取值:
更多信息,请参见云盘概述。 |
资源栈信息配置
配置项 |
说明 |
资源栈策略 |
取值:
关于资源栈策略的更多信息,请参见资源栈策略。 |
失败时回滚 |
取值:
|
超时设置 |
如果所有资源的创建或更新没有在该时间内完成,系统将自动回滚到创建或更新之前的状态。 取值范围:10~1440。 单位:分钟。 |
删除保护 |
防止资源栈被意外删除。取值:
|
RAM角色 |
您可以创建可信实体为资源编排服务的RAM角色,然后根据ROS模板中资源所需最小权限为RAM角色授权。
|
标签 |
由一对键值对组成,方便您对资源栈进行分类。 您可以单击添加,然后在编辑标签绑定对话框设置标签键和标签值,最后单击确定。 |
资源组 |
您可以选择资源栈所在的资源组。如果不指定资源组,资源栈将加入默认资源组。 关于如何创建资源组,请参见创建资源组。 |
创建资源栈
7. 在检查并确认页面,单击创建。
3. 查看资源栈
本步骤将指导您在完成创建资源栈操作后,如何查询资源栈详情。
1. 进入资源编排控制台。
2. 在左侧导航栏单击资源栈。
3. 在页面左上角的地域下拉列表,选择资源栈的所在地域。
4. 在资源栈列表页面,找到需要查看的资源栈,单击资源栈名称列的资源栈ID。
5. 在资源栈管理页面,您可以执行以下操作:
单击资源栈信息页签,查看基本信息和资源栈策略。
查看资源栈事件
6. 单击事件页签,查看资源栈生命周期中发生的每一个事件。
查看资源栈资源
7. 单击资源页签,查看资源栈创建涉及到的资源。
说明:ECS属于付费云产品资源,请您及时释放。您可以点击资源列表下的EcsInstance栏中的ECS实例ID,即可跳转至ECS控制台查看本次创建的ECS资源信息。
4. 释放资源栈
本步骤将指导您如何释放通过资源编排控制台创建资源内容。
进入资源栈列表
1. 在模板页签,单击右上角的 图标。
选择待删除的资源栈
2. 在资源栈列表页面,找到您创建的资源栈,单击操作列下的删除。
选择资源栈删除方式并删除
3. 在删除资源栈对话框中,删除方式选择释放资源,单击确定。
实验链接:https://developer.aliyun.com/adc/scenario/880d8dde92e64242be60375073ce6e2a