背景

资源编排服务(Resource Orchestration Service, 简称ROS)是阿里云提供的一项简化云计算资源管理的服务。您可以遵循ROS定义的模板规范编写资源栈模板,在模板中定义所需的云计算资源(例如ECS实例、RDS数据库实例)、资源间的依赖关系等。ROS的编排引擎将根据模板自动完成所有资源的创建和配置,实现自动化部署及运维。

基础篇中,我们熟悉了模块的相关知识,并以复用网络设置(安全组)为例,创建和使用了模块。

模块可以实现模板代码复用,以达到模块化和简化基础设施配置的效果。除此之外,模块还具有哪些能力,能解决什么问题?

模块能力

输入输出

  • 模块支持自定义输入:
    • 模块参数可以帮助您将自定义值从模板(或模块)输入到模块中,模块可以使用自定义值来设置资源(或子模块)的属性。
    • 如果模块参数未指定,且该参数有默认值(Default),则会使用默认值。
  • 模块支持自定义输出:可以把模块当作资源,其输出当作资源属性,使用Fn::GetAtt、Fn::Sub内部函数访问模块输出。

公共模块

公共模块是资源编排为您提供的可直接使用的模块,可以在控制台查看。

公共模块是对功能的封装,当前提供的公共模块如下:

模块名称

说明

MODULE::ACS::CS::Provision

该模块用于开通容器服务并进行云资源访问授权。

MODULE::ACS::ComputeNest::ClusterHelmApplication

该模块用于在ack集群上进行helm chart部署。

MODULE::ACS::ComputeNest::FluxOciHelmDeploy

该模块用于在ack集群上使用fluxcd进行helm部署。

MODULE::ACS::FC::RunPythonScript

该模块用于运行Python代码并获取结果。

MODULE::ACS::OOS::ExecuteAPI

该模块用于执行一次阿里云OpenAPI,并获取其输出。

MODULE::ACS::OOS::ExecuteTemplate

该模块用于执行OOS模板。

MODULE::ACS::RAM::TemporaryRole

该模块用于创建一个临时角色,该角色在资源栈执行期间可以被使用。

MODULE::ACS::ROS::PythonCustomResource

该模块用于自定义一个使用Python代码实现的资源。

当您创建、更新(如果您更改了自定义资源)或删除资源栈时,ROS会运行该逻辑。

MODULE::ACS::ROS::PythonCustomResourceCreator

该模块用于从GitHub代码仓库(Python)构建和使用ROS自定义资源。

MODULE::ACS::VPC::EIPs

该模块用于创建并绑定多个弹性公网IP。

MODULE::ACS::VPC::OptionalVpcAndVSwitch

该模块用于新建或返回已有的 VPC 和 VSwitch。

版本管理

  • 模块支持多版本:版本从v1开始递增,可删除。
  • 使用模块时,通过Version字段为模块指定版本,Version取值如下:
    • 指定版本:格式为v+数字,例如v1、v10。
    • default:默认版本。
      • 只要模块未删除,模块始终存在一个可用的默认版本。
      • 您可以通过API或控制台自行设置自定义模块的默认版本。
      • 使用自定义模块时,建议使用此方式。使用公共模块时,建议使用此方式。
    • latest:最新版本。
      • 只要模块未删除,模块始终存在一个可用的最新版本。
      • 当模块创建新版本或删除最新版本时,最新版本会发生变化。
      • 开发调试模块时,建议使用此方式。

共享模块

模块使用四段式命名约定:MODULE::Organization::Service::Usecase。

  • MODULE:固定值。
  • Organization:组织名称。
  • Service:产品名称。
  • Usecase:资源名称。

创建模块时,如果Organization为SHARE,则Service必须为当前账号的主账号ID,例如MODULE::SHARE::123456789::Usecase。

这种特殊的自定义模块也称为共享模块。其他用户可以查看和使用您的共享模块,但无法修改和删除它。

共享模块用于跨账号访问和使用。

例如,网络团队把网络配置封装为模块,并在他们的账号中向其他团队提供,其他团队可以在他们的账号中直接使用。

使用场景示例

除了对基础设施模块化外,下面展示了模块的一些其他使用场景。

把模块当作配置

创建一个模块MODULE::MyOrg::MyApp::InfrastructureSetting,其内容如下:

ROSTemplateFormatVersion: '2015-09-01'
Outputs:
NamePrefix:
Value: MyOrg-MyApp-
Description: 名称前缀

使用下面的模板创建一部分基础设施(地域选择杭州),所有资源的名称属性都使用了Setting.NamePrefix作为前缀。

ROSTemplateFormatVersion: '2015-09-01'
Resources:
Setting:
Type: MODULE::MyOrg::MyApp::InfrastructureSetting
Version: default
Vpc:
Type: ALIYUN::ECS::VPC
Properties:
VpcName:
Fn::Sub: "${Setting.NamePrefix}Vpc"
CidrBlock: 192.168.0.0/16
VSwitch:
Type: ALIYUN::ECS::VSwitch
Properties:
VpcId:
Ref: Vpc
VSwitchName:
Fn::Sub: "${Setting.NamePrefix}VSwitch"
CidrBlock: 192.168.0.0/24
ZoneId: cn-hangzhou-k

预览资源栈,可以看到Vpc和VSwitch名称属性的前缀都为NamePrefix中设定的值。

把模块当作数据处理工具

创建一个模块MODULE::MyOrg::Common::InfrastructureSetting,其内容如下:

该模块接受组织名称和应用名称作为输入,输出Vpc名称、VSwitch名称和默认可用区。

ROSTemplateFormatVersion: '2015-09-01'
Parameters:
OrgName:
Type: String
Default: MyOrg
Description: 组织名称
AppName:
Type: String
Description: 应用名称
Outputs:
VpcName:
Value:
'Fn::Sub': '${OrgName}-${AppName}-Vpc'
Description: Vpc名称
VSwitchName:
Value:
'Fn::Sub': '${OrgName}-${AppName}-VSwitch'
Description: VSwitch名称
DefaultZoneId:
Value:
'Fn::Select':
- '0'
- 'Fn::GetAZs':
Ref: 'ALIYUN::Region'
Description: 默认可用区
NamePrefix:
Value:
'Fn::Sub': '${OrgName}-${AppName}-'
Description: 名称前缀
LowerNamePrefix:
Value:
'Fn::Jq':
- First
- '.[0] | ascii_downcase'
- - 'Fn::Sub': '${OrgName}-${AppName}-'
Description: 小写名称前缀

使用下面的模板创建一部分基础设施(无地域限制),传递应用名称给模块,资源部分属性(VpcName、VSwitchName、ZoneId)引用模块的输出。

ROSTemplateFormatVersion: '2015-09-01'
Resources:
Setting:
Type: MODULE::MyOrg::Common::InfrastructureSetting
Version: default
Properties:
AppName: MyApp
Vpc:
Type: ALIYUN::ECS::VPC
Properties:
VpcName: !GetAtt Setting.VpcName
CidrBlock: 192.168.0.0/16
VSwitch:
Type: ALIYUN::ECS::VSwitch
Properties:
VpcId:
Ref: Vpc
VSwitchName: !GetAtt Setting.VSwitchName
CidrBlock: 192.168.0.0/24
ZoneId: !GetAtt Setting.DefaultZoneId

预览资源栈,VpcName和VSwitchName都带上了前缀,ZoneId也实现了自动获取。

用模块来包装资源

创建一个模块MODULE::MyOrg::Common::OssPrivateBucket,其内容如下:

该模块选择了ALIYUN::OSS::Bucket部分会用到的资源属性进行了封装,并设置AccessControl为private,也就是限制Bucket只能为私有,以达到安全合规的目的。

ROSTemplateFormatVersion: '2015-09-01'
Resources:
Bucket:
Type: 'ALIYUN::OSS::Bucket'
Properties:
AccessControl: private
Tags:
Ref: Tags
RedundancyType:
Ref: RedundancyType
EnableOssHdfsService:
Ref: EnableOssHdfsService
ResourceGroupId:
Ref: ResourceGroupId
BucketName:
Ref: BucketName
DeletionForce:
Ref: DeletionForce
StorageClass:
Ref: StorageClass
Parameters:
Tags:
Default: null
Required: false
Type: Json
Description:
zh-cn: 存储空间标签。Key-Value形式的键值对。
en: Bucket tags in k-v pairs format.
Label:
zh-cn: 存储空间标签
en: Tags
RedundancyType:
AssociationPropertyMetadata:
LocaleKey: OSSRedundancyType
Description:
en: >-
Specifies the data disaster recovery type of the storage space. The
value range is as follows: LRS (default): Local redundant LRS stores your data redundantly on
different storage devices in the same availability zone, and can support
data loss and normal access even when two storage devices are damaged
concurrently. ZRS: Intra-city redundant ZRS adopts a data redundancy storage mechanism
in multiple availability zones (AZ), and stores user data redundantly in
multiple availability zones in the same region. When an availability
zone is unavailable, normal access to data can still be guaranteed.
Default: LRS
Required: false
Label:
zh-cn: 存储冗余类型
AllowedValues:
- LRS
- ZRS
Type: String
EnableOssHdfsService:
Default: false
Required: false
Type: Boolean
Description:
en: |-
Whether enable OSS-HDFS service.
**Note**: Once it's enabled, it can't be disabled again.
Label:
zh-cn: 是否开启OSS-HDFS服务
en: EnableOssHdfsService
ResourceGroupId:
Description:
en: The resource group id.
Default: null
Required: false
Label:
zh-cn: 资源组ID
en: ResourceGroupId
AssociationProperty: 'ALIYUN::ECS::ResourceGroup::ResourceGroupId'
Type: String
BucketName:
Required: true
Type: String
Description:
en: bucket name.
Label:
zh-cn: Bucket名称
DeletionForce:
Default: false
Required: false
Type: Boolean
Description:
en: >-
Whether force delete the relative objects in the bucket. Default value
is false.
Label:
zh-cn: 是否强制删除OSS中的文件
en: DeletionForce
StorageClass:
AssociationPropertyMetadata:
LocaleKey: OSSStorageClass
Description:
en: Specifies the storage class of the bucket. Default is "Standard".
Default: null
Required: false
Label:
zh-cn: 存储空间类型
en: StorageClass
AllowedValues:
- Standard
- IA
- Archive
- ColdArchive
Type: String
Outputs:
InternalDomainName:
Description: The internal DNS name of the specified bucket.
Value:
'Fn::GetAtt':
- Bucket
- InternalDomainName
Name:
Description: The name of Bucket
Value:
'Fn::GetAtt':
- Bucket
- Name
DomainName:
Description: The public DNS name of the specified bucket.
Value:
'Fn::GetAtt':
- Bucket
- DomainName
Metadata:
'ALIYUN::ROS::Interface':
ParameterGroups:
- Parameters:
- BucketName
- StorageClass
- RedundancyType
- DeletionForce
Label:
default:
zh-cn: 基础设置
en: Base Configuration
- Parameters:
- ResourceGroupId
- Tags
Label:
default:
zh-cn: 管理设置
en: Manage Configuration
- Parameters:
- EnableOssHdfsService
Label:
default:
zh-cn: 其他设置
en: Other Configuration

使用下面的模板创建一部分基础设施。

ROSTemplateFormatVersion: "2015-09-01"
Resources:
Setting:
Type: MODULE::MyOrg::Common::InfrastructureSetting
Version: default
Properties:
AppName: MyApp
Bucket:
Type: MODULE::MyOrg::Common::OssPrivateBucket
Version: default
Properties:
BucketName:
Fn::Sub: "${Setting.LowerNamePrefix}bucket"

预览资源栈,Bucket为私有。

资源编排ROS之模块:实现模板代码复用(进阶篇)的更多相关文章

  1. 基于Python接口自动化测试框架+数据与代码分离(进阶篇)附源码

    引言 在上一篇<基于Python接口自动化测试框架(初级篇)附源码>讲过了接口自动化测试框架的搭建,最核心的模块功能就是测试数据库初始化,再来看看之前的框架结构: 可以看出testcase ...

  2. 开发函数计算的正确姿势 —— 使用 ROS 进行资源编排

    前言 首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传.函数计算 ...

  3. 读取web工程中.properties资源文件的模板代码

    读取web工程中.properties资源文件的模板代码 // 读取web工程中.properties资源文件的模板代码 private void test2() throws IOException ...

  4. Django---Http协议简述和原理,HTTP请求码,HTTP请求格式和响应格式(重点),Django的安装与使用,Django项目的创建和运行(cmd和pycharm两种模式),Django的基础文件配置,Web框架的本质,服务器程序和应用程序(wsgiref服务端模块,jinja2模板渲染模块)的使用

    Django---Http协议简述和原理,HTTP请求码,HTTP请求格式和响应格式(重点),Django的安装与使用,Django项目的创建和运行(cmd和pycharm两种模式),Django的基 ...

  5. SAP FI CO模块常用事务代码

                                                                                                        ...

  6. 在pycharm中自定义模板代码,快速输出固定代码块

    pycharm中有时会经常输出固定一段代码,为避免每次重复输入,可以自定义一段模板代码,请看以下图教程: 1.  点击 file   里面的   setting 2. 在搜索框输入live,就会显示出 ...

  7. IaC云资源编排-Terraform

    Terraform 2019/10/14 Chenxin 整理 转自: https://cloud.tencent.com/developer/article/1469162 IaC与资源编排 IaC ...

  8. inputstream和outputstream读写数据模板代码

    //读写数据模板代码 byte buffer[] = new byte[1024]; int len=0; while((len=in.read(buffer))>0){ out.write(b ...

  9. eclipse 中 Servlet 模板代码(其实是代码提示模板)

    说的是模板代码,应该说的是提示的模板代码,并不是一新建就会出现模板. 第一步:先建一个Servlet文件,写好自己想要的模板 我的模板如下: 全选并复制,等会要粘贴到Servlet的提示模板中. pa ...

  10. 用Case类生成模板代码

    将类定义为case类会生成许多模板代码,好处在于: ①会生成一个apply方法,这样就可以不用new关键字创建新的实例. ②由于case类的构造函数参数默认是val,那么构造函数参数会自动生成访问方法 ...

随机推荐

  1. 重走py 之路 ——列表(一)

    前言 因为最近公司有python项目维护,所以把python的基础入门的书整理一遍,因为有些忘记了,同时在看<<python编程>>这本书的时候觉得对有基础的有很多的赘余,打算 ...

  2. 有用的JavaScript技巧

    首次为变量赋值时务必使用var关键字 变量没有声明而直接赋值得话,默认会作为一个新的全局变量,要尽量避免使用全局变量. 使用===取代== ==和!=操作符会在需要的情况下自动转换数据类型.但===和 ...

  3. 深度解读《深度探索C++对象模型》之返回值优化

    接下来我将持续更新"深度解读<深度探索C++对象模型>"系列,敬请期待,欢迎关注!也可以关注公众号:iShare爱分享,自动获得推文和全部的文章列表. 没有启用返回值优 ...

  4. Qt 从 QTransform 逆向解出 Translate/Scale/Rotate(平移/缩放/旋转)分析

    QTransform 用于图形绘制,它定义了如何平移(translate).缩放(scale).切变(shear).旋转(rotate)或投射(project)坐标系.注意:QTransform 是作 ...

  5. 力扣233(java)-数字1的个数(困难)

    题目: 给定一个整数 n,计算所有小于等于 n 的非负整数中数字 1 出现的个数. 示例 1: 输入:n = 13输出:6示例 2: 输入:n = 0输出:0 提示: 0 <= n <= ...

  6. TairSearch:加速多列索引查询

    简介: 互联网及传统行业应用服务的关键数据一般存储在MySQL这类的关系型数据库中.如需缓解数据库访问压力,可引入Redis等缓存系统承担热数据的查询,以此提升查询效能.然而业务场景如果是在数据库上做 ...

  7. 现代斗山X瓴羊:“一横四纵“解决方案聚焦中台场景级部署

    简介: 经过充分的调研后,现代斗山IT团队和业务团队,与瓴羊数据中台项目组一起完成了涵盖客户.商机.设备等多层面的问题梳理及痛点分析,并借助于瓴羊Dataphin+Quick BI+Quick Aud ...

  8. 一文说清linux system load

    ​简介:双十一压测过程中,常见的问题之一就是load 飙高,通常这个时候业务上都有受影响,比如服务rt飙高,比如机器无法登录,比如机器上执行命令hang住等等.本文就来说说,什么是load,load是 ...

  9. WPF 使用 Silk 的 Direct2D 入门

    在上一篇博客的基础上,使用 dotnet 基金会新开源的 Silk.NET 库,让 Silk.NET 创建的 DX 设备和 WPF 对接渲染.接下来本文将告诉大家如何使用 Silk.NET 提供的 D ...

  10. 特权同学笔记-《边练边学》-在QP里调用modelsim的步骤

    在QP里调用Modelsim需要先设置仿真参数和工具路径. 在QP调用modelsim的步骤 1. 在QP里建立工程,代码,分析综合:2. 添加testbench代码,processing-start ...