资源编排ROS之模块:实现模板代码复用(进阶篇)

本文涉及的产品
云服务器 ECS,每月免费额度200元 3个月
云服务器ECS,u1 2核4GB 1个月
简介: 资源编排ROS模块能够实现模板代码复用。支持输入输出、公共模块、版本管理、共享模块等功能。在使用场景上,除了对基础设施模块化外,还可作为配置、数据处理工具或资源包装器。

背景

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

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

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

模块能力

输入输出

  • 模块支持自定义输入:
  • 模块参数可以帮助您将自定义值从模板(或模块)输入到模块中,模块可以使用自定义值来设置资源(或子模块)的属性。
  • 如果模块参数未指定,且该参数有默认值(Default),则会使用默认值。
  • 模块支持自定义输出:可以把模块当作资源,其输出当作资源属性,使用Fn::GetAttFn::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+数字,例如v1v10
  • default:默认版本。
  • 只要模块未删除,模块始终存在一个可用的默认版本。
  • 您可以通过API或控制台自行设置自定义模块的默认版本。
  • 使用自定义模块时,建议使用此方式。使用公共模块时,建议使用此方式。
  • latest:最新版本。
  • 只要模块未删除,模块始终存在一个可用的最新版本。
  • 当模块创建新版本或删除最新版本时,最新版本会发生变化。
  • 开发调试模块时,建议使用此方式。

共享模块

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

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

创建模块时,如果OrganizationSHARE,则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

预览资源栈,可以看到VpcVSwitch名称属性的前缀都为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: 小写名称前缀

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

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

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

用模块来包装资源

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

该模块选择了ALIYUN::OSS::Bucket部分会用到的资源属性进行了封装,并设置AccessControlprivate,也就是限制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为私有。

相关实践学习
Docker镜像管理快速入门
本教程将介绍如何使用Docker构建镜像,并通过阿里云镜像服务分发到ECS服务器,运行该镜像。
阿里云资源编排ROS使用教程
资源编排(Resource Orchestration)是一种简单易用的云计算资源管理和自动化运维服务。用户通过模板描述多个云计算资源的依赖关系、配置等,并自动完成所有资源的创建和配置,以达到自动化部署、运维等目的。编排模板同时也是一种标准化的资源和应用交付方式,并且可以随时编辑修改,使基础设施即代码(Infrastructure as Code)成为可能。 产品详情:https://www.aliyun.com/product/ros/
目录
相关文章
|
24天前
第八章 Helm 模板高效互用动态参数生成
第八章 Helm 模板高效互用动态参数生成
20 1
|
存储 缓存 JSON
Unity资源热更新知识梳理及工作流介绍
研究了大半年的热更,才做出了一套相对完善的热更架构。不得不说,这块的知识点还是多而杂的,值得专门开篇博文来记录梳理。
2259 0
|
1月前
|
弹性计算 运维 安全
资源编排ROS之模块:实现模板代码复用(基础篇)
ROS是阿里云的资源管理服务,通过模板定义和编排引擎自动化部署云资源。模块是可预测、重用、追溯和管理的资源集合,分为公共和自定义类型。它们简化了复杂配置,如安全组,可在多个模板和账号中复用。创建模块后,可在资源栈中引用,实现标准化部署。
51 1
|
9月前
|
人工智能 数据可视化 前端开发
如何用smardaten无代码平台进行复杂逻辑编排?
如何用smardaten无代码平台进行复杂逻辑编排?
|
弹性计算 JSON 安全
ROS-编写并运行模板|学习笔记
快速学习 ROS-编写并运行模板
129 0
ROS-编写并运行模板|学习笔记
|
消息中间件 存储 机器学习/深度学习
如何使用 Serverless 框架运行时来管理函数生命周期
本文详细介绍了函数生命周期及如何使用 Serverless 框架 / 运行时来管理函数生命周期。
402 0
|
资源调度 Kubernetes 监控
如何可视化编写和编排你的 K8s 任务
通过任务调度 SchedulerX 来调度你的 K8s 任务,能够降低学习成本,加快开发效率,让你的任务失败可报警,出问题可排查,打造云原生可观测体系下的可视化 K8s 任务。
如何可视化编写和编排你的 K8s 任务
|
资源调度 Kubernetes 监控
如何可视化编写和编排你的k8s任务
阿里任务调度SchedulerX和云原生结合,重磅推出可视化k8s任务,针对脚本使用者,屏蔽了容器服务的细节,不用构建镜像就可以让不熟悉容器的同学(比如运维和运营同学)玩转k8s Job,受益容器服务带来的降本增效福利。针对容器使用者,SchedulerX不但完全兼容原生的k8s Job,还能支持历史执行记录、日志服务、重跑任务、报警监控、可视化任务编排等能力,为企业级应用保驾护航
1279 1
|
存储 开发工具 Android开发
学习笔记:插件化资源解决
学习笔记:插件化资源解决
151 0
|
JSON Kubernetes Cloud Native
源码解读:KubeVela 是如何将 appfile 转换为 K8s 特定资源对象的
KubeVela 是一个简单易用又高度可扩展的云原生应用管理引擎,是基于 Kubernetes 及阿里云与微软云共同发布的云原生应用开发模型 OAM 构建。本文主要目的是探索 KubeVela 如何将一个 appfile 文件转换为 K8s 中特定的资源对象。
源码解读:KubeVela 是如何将 appfile 转换为 K8s 特定资源对象的