文档

创建全托管服务并自定义服务的运维操作

创建全托管服务时,服务商可以对服务设置自定义的运维操作。本文以修改MySQL服务密码为例介绍服务商如何在全托管服务中自定义运维。

步骤一:创建全托管服务

  1. 登录计算巢控制台

  2. 在左侧导航栏中,选择服务目录 > 我的服务,在我的服务页面中,选择我发布的服务,然后单击创建新服务

  3. 创建新服务界面,配置服务信息。

    说明

    此处只描述该示例需要配置和其他必须配置的参数,其余参数保持默认值。

    1. 选择自主手动创建服务,然后在选择以下服务类型处,选择全托管服务

    2. 单击下一步:配置服务

    3. 基本信息区域,填写服务的基本信息。2024-03-14_10-46-10.png

    4. 服务部署区域,配置服务所需的资源。服务部署

      配置项

      参数值

      租户类型

      单租户

      用户类型

      阿里云

      部署地域

      华东1(杭州)

      录入方式

      手动录入模板

      部署方式

      ROS

      模板内容

      选择YAML页签,并输入模板内容。

      此处模板中定义了如何创建一个MySQL数据库服务,并设置了用户在创建服务实例时需要填写数据库的参数和创建完成后输出的信息。模板内容的详细信息,请参见服务模板示例

      套餐设置

      创建一个套餐。

      参数映射关系

      将模板中RegionIdVpcId进行映射;将ZoneIdvSwitchId进行映射。

      隐藏参数

      VpcId、vSwitchId和EcsInstanceType。

      该部分参数不需要对用户透出,因此设置为隐藏。

      角色名称

      ComputeNestDeploy

    5. 服务运维(选填)区域,配置服务的运维功能。

      1. 运维区域,选中需要给用户授权并选中全部权限。

      2. 单击添加自定义运维操作,在弹出的添加自定义运维操作弹窗中选中OOS模板后,设置如下信息。自定义运维操作

        配置项

        参数值

        操作名称

        修改密码

        操作者

        全部

        • 当参数选择全部时,服务商和用户都能进行此项运维操作。

        • 当参数选择服务商时,仅服务商能进行此项运维操作。

        录入方式

        手动录入

        模板内容

        填写OOS模板定义运维操作的内容。

        在运维模板中,定义用户修改密码的操作,用户在进行修改密码时,只需输入原密码和新密码即可,计算巢会自动调用模板中的内容,将原密码替换为新密码。模板内容的详情信息,请参见运维模板示例

        重要

        在运维模板中,在定义实例筛选值时,需要使用伪参数(acs:computenest:serviceInstanceId)作为标签,筛选目标实例。否则在进行运维操作时,可能会将运维操作执行到其他服务实例的ECS实例上。

      3. 单击确定

  4. 单击保存服务

步骤二:创建并运维服务实例

  1. 创建服务实例。

    创建服务实例的详细信息,请参见创建全托管服务实例

  2. 运维服务实例。

    1. 找到您需要运维的服务实例,单击服务实例名称,进入服务实例详情页。

    2. 单击运维管理,进入运维管理页签。2024-03-14_11-12-10.png

    3. 单击服务实运维区域的修改密码,并在弹出的创建自定义任务弹窗中,输入当前密码和新密码,并单击下一步

      修改密码

    4. 确认信息无误后,单击创建

      确认信息

  3. 查看运维结果。

    创建运维操作后,可以返回运维管理页签中,查看运维操作结果。运维结果

服务模板示例

ROSTemplateFormatVersion: '2015-09-01'
# 定义参数
Parameters:
  # 可用区
  ZoneId:
    Type: String
    AssociationProperty: ALIYUN::ECS::Instance:ZoneId
    Label:
      en: VSwitch Available Zone
      zh-cn: 可用区
  # 数据盘类型
  DataDiskCategory:
    Type: String
    AllowedValues:
      - cloud_efficiency        # 高效云盘
      - cloud_ssd               # SSD云盘
      - cloud                   # 普通云盘
      - cloud_essd              # ESSD云盘
    Default: cloud_efficiency
    Label:
      en: Disk Type
      zh-cn: 数据盘类型
    AssociationPropertyMetadata:
      LocaleKey: DiskCategory
  # 数据盘空间
  DataDiskSize:
    Type: Number
    Label:
      en: Data Disk Space
      zh-cn: 数据盘空间
    MinValue: 20
    MaxValue: 500
    Default: 40
  # 数据库root账户密码
  Password:
    # 查询该参数时只输出星号(*)
    NoEcho: true
    Type: String
    Description:
      en: 'Database root account passwor, 8-32 characters, including uppercase and lowercase letters, numbers and special symbols (including: !@#$%^&*-+=_).'
      zh-cn: 数据库root账户密码,长度8~32个字符,可包含大小字母、数字及特殊符号(包含:!@#$%^&*-+=_)。
    Label:
      en: Root Account Password
      zh-cn: 数据库root账户密码
    ConstraintDescription:
      en: '8-32 characters, including uppercase and lowercase letters, numbers and special symbols (including: !@#$%^&*-+=_).'
      zh-cn: 8~32个字符,可包含大小字母、数字及特殊符号(包含:!@#$%^&*-+=_)。
    MinLength: '8'
    MaxLength: '32'
    AssociationProperty: ALIYUN::ECS::Instance::Password
  # 专有网络VPC实例ID
  VpcId:
    AssociationProperty: ALIYUN::ECS::VPC::VPCId
    Type: String
    Label:
      en: VPC ID
      zh-cn: 专有网络VPC实例ID
  # 交换机实例ID
  VSwitchId:
    AssociationProperty: ALIYUN::ECS::VSwitch::VSwitchId
    AssociationPropertyMetadata:
      VpcId: ${VpcId}
      ZoneId: ${ZoneId}
    Type: String
    Label:
      en: VSwitch ID
      zh-cn: 交换机实例ID
  # Ecs实例类型
  EcsInstanceType:
    Type: String
    Label:
      en: Instance Type
      zh-cn: Ecs实例类型
    AssociationProperty: ALIYUN::ECS::Instance::InstanceType
# 定义资源
Resources:
  # 定义WaitCondition和WaitConditionHandle来等待命令在Ecs中执行完毕部署成功
  WaitCondition:
    Type: ALIYUN::ROS::WaitCondition
    Properties:
      Count: 1
      Handle:
        Ref: WaitConditionHandle
      Timeout: 1800
  WaitConditionHandle:
    Type: ALIYUN::ROS::WaitConditionHandle
  EcsSecurityGroup:
    Type: 'ALIYUN::ECS::SecurityGroup'
    Properties:
      SecurityGroupIngress:
        - Priority: 1
          PortRange: 3306/3306
          NicType: intranet
          SourceCidrIp: 0.0.0.0/0
          IpProtocol: tcp
      VpcId:
        Ref: VpcId
  # ECS实例
  EcsInstance:
    Type: ALIYUN::ECS::Instance
    Properties:
      # I/O优化实例
      IoOptimized: optimized
      DiskMappings:
        - Category:
            Ref: DataDiskCategory
          Device: /dev/xvdb
          Size:
            Ref: DataDiskSize
      SystemDiskSize: 40
      # cloud-init执行用户命令
      # /var/log/cloud-init.log /var/log/cloud-init-output.log 可以看到执行日志
      # /var/lib/cloud/instance/scripts/part-001 为具体的脚本可以sh执行来排查问题
      UserData:
        Fn::Sub:
          - |
            #!/bin/sh

            # sleep一段时间确保网络就绪
            sleep 10

            # 对数据盘进行分区

            cat >> /root/InitDataDisk.sh << EOF
            #!/bin/bash
            echo "p
            n
            p



            w
            " |  fdisk -u /dev/vdb
            EOF
            /bin/bash /root/InitDataDisk.sh
            rm -f /root/InitDataDisk.sh
            rm -f InitDataDisk.sh
            # 在新分区上创建文件系统
            mkfs.ext4 /dev/vdb1
            # 创建目录,MySQL将安装在该目录下
            mkdir /data1
            # 挂载文件系统
            mount /dev/vdb1 /data1
            # 向 /etc/fstab 写入新分区信息
            echo /dev/vdb1 /data1 ext4 defaults,nodelalloc,noatime 0 2 >> /etc/fstab
            cd /data1/

            # 安装社区版MySQL
            wget http://repo.mysql.com/mysql-community-release-el6-5.noarch.rpm
            rpm -ivh mysql-community-release-el6-5.noarch.rpm
            yum repolist all | grep mysql
            yum install mysql-community-server -y

            # 启动MySQL服务
            service mysqld start

            # 以超级用户身份登入,创建admin用户,并允许admin用户以Password为密码远程登录
            mysqladmin -u root password '${Password}'
            echo "create database test character set utf8 collate utf8_bin;" > ./test.sql
            echo "CREATE USER 'admin'@'%' IDENTIFIED BY '${Password}';" >> ./test.sql
            echo "GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' WITH GRANT OPTION;" >> ./test.sql
            mysql -u root -p'${Password}' < ./test.sql

            # 将MySQL的配置和数据路径移动到数据盘上
            systemctl stop mysqld
            rsync -av /var/lib/mysql /data1
            # 修改配置文件
            sed -i 's/\/var\/lib/\/data1/g' /etc/my.cnf
            echo -e '\n' >> /etc/my.cnf
            echo '[client]' >> /etc/my.cnf
            echo 'port=3306' >> /etc/my.cnf
            echo 'socket=/data1/mysql/mysql.sock' >> /etc/my.cnf
            # 重启MySQL
            systemctl start mysqld

            # 执行成功回调WaitCondition结束WaitCondition的等待
            ${CurlCli} -d "{\"Data\" : \"SUCCESS\", \"Status\" : \"SUCCESS\"}"

          # 获取到WaitConditionHandle的地址放到 ${CurlCli}变量里
          - CurlCli:
              Fn::GetAtt:
                - WaitConditionHandle
                - CurlCli
            # 数据库root账户密码
            Password:
              Ref: Password
      # 付费方式:按量付费
      InstanceChargeType: PostPaid
      # 系统盘类型:高效云盘
      SystemDiskCategory: cloud_efficiency
      # 实例名称
      InstanceName:
        Fn::Join:
          - '-'
          - - mysql
            - Ref: ALIYUN::StackName
      VpcId:
        Ref: VpcId
      SecurityGroupId:
        Ref: EcsSecurityGroup
      VSwitchId:
        Ref: VSwitchId
      # 指定CentOS 7.9镜像,如果修改镜像,UserData脚本需要进行适配
      ImageId: "centos_7_9_x64_20G_alibase_20220727.vhd"
      InstanceType:
        Ref: EcsInstanceType
      # 主机名
      HostName: mysql-public-ip
      # Ecs登录密码
      Password:
        Ref: Password
      # 是否为实例分配公网IP
      AllocatePublicIP: true
# 定义输出
Outputs:
  # 将数据库连接地址显示在控制台
  DBConnectionAddress:
    Value:
      # 将Ecs的公网IP拼接成数据库连接地址
      Fn::Sub:
        - mysql://${Domain}:3306
        - Domain:
            Fn::GetAtt:
              - EcsInstance
              - PublicIp
# 定义元数据
Metadata:
  ALIYUN::ROS::Interface:
    # 定义资源分组,创建服务实例时,同一分组的参数分布在一起
    ParameterGroups:
      - Parameters:
          - ZoneId
          - Password
        Label:
          en: Basic Configuration
          zh-cn: 基础配置
      - Parameters:
          - EcsInstanceType
        Label:
          en: Instance Type
          zh-cn: 实例规格
      - Parameters:
          - DataDiskCategory
          - DataDiskSize
        Label:
          en: Data Disk Configuration
          zh-cn: 数据盘配置
      - Parameters:
          - VpcId
          - VSwitchId
        Label:
          en: Network Configuration
          zh-cn: 网络配置

运维模板示例

重要

运维模板中,在定义实例筛选值时,需要使用伪参数(acs:computenest:serviceInstanceId)作为标签,筛选目标实例。否则在进行运维操作时,可能会将运维操作执行到其他服务实例的ECS实例上。

FormatVersion: OOS-2019-06-01
Description:
  en: Bulky run command on ECS instances
  zh-cn: 批量在多台ECS实例上运行云助手命令
  name-en: Run Command
  name-zh-cn: 发送远程命令
Parameters:
  regionId:
    Type: String
    Label:
      en: RegionId
      zh-cn: 地域ID
    AssociationProperty: RegionId
    Default: '{{ ACS::RegionId }}'
  serviceInstanceId:
    Type: String
    AssociationProperty: ALIYUN::ComputeNest::ServiceInstance::ServiceInstanceId
    Label:
      en: ServiceInstanceId
      zh-cn: 服务实例ID
    AssociationPropertyMetadata:
      Disabled: true
  old_password:
    Label:
      en: OldPassword
      zh-cn: 当前密码
    Type: String
  new_password:
    Label:
      en: NewPassword
      zh-cn: 新密码
    Type: String
Tasks:
  - Name: getInstance
    Description:
      en: Views the ECS instances
      zh-cn: 获取ECS实例
    Action: ACS::SelectTargets
    Properties:
      ResourceType: ALIYUN::ECS::Instance
      RegionId: '{{ regionId }}'
      Filters:
        - Type: All
          RegionId: '{{regionId}}'
          Parameters:
            RegionId: '{{regionId}}'
            Status: Running
            Tags:
              - Key: acs:computenest:serviceInstanceId
                Value: '{{serviceInstanceId}}'
    Outputs:
      instances:
        Type: List
        ValueSelector: '.Instances.Instance[] | {"InstanceId":.InstanceId, "PublicIpAddress":.PublicIpAddress.IpAddress[0]}'
  - Name: runCommand
    Action: ACS::ECS::RunCommand
    Description:
      en: Execute cloud assistant command
      zh-cn: 执行云助手命令
    Properties:
      regionId: '{{ regionId }}'
      commandType: RunShellScript
      commandContent:
        Fn::Replace:
          - PublicIpAddress:
              Fn::Select:
                - PublicIpAddress
                - '{{ ACS::TaskLoopItem }}'
          - mysqladmin -uadmin -h PublicIpAddress -p'{{old_password}}' password {{new_password}}
      instanceId:
        Fn::Select:
          - InstanceId
          - '{{ ACS::TaskLoopItem }}'
    Loop:
      Items: '{{ getInstance.instances }}'
      Outputs:
        commandOutputs:
          AggregateType: Fn::ListJoin
          AggregateField: commandOutput
    Outputs:
      commandOutput:
        Type: String
        ValueSelector: invocationOutput
Outputs:
  commandOutputs:
    Type: List
    Value: '{{ runCommand.commandOutputs }}'
Metadata:
  ALIYUN::OOS::Interface:
    ParameterGroups:
      - Parameters:
          - regionId
        Label:
          default:
            zh-cn: 选择地域
            en: Select RegionId

  • 本页导读 (0)
文档反馈