创建全托管服务时,服务商可以对服务设置自定义的运维操作。本文以修改MySQL服务密码为例介绍服务商如何在全托管服务中自定义运维。
步骤一:创建全托管服务
登录计算巢控制台。
在左侧导航栏中,单击我的服务,在我的服务页面中,选择我创建的服务,然后单击创建新服务。
在创建新服务界面,配置服务信息。
说明此处只描述该示例需要配置和其他必须配置的参数,其余参数保持默认值。
选择自主手动创建服务,然后在选择以下服务类型处,选择全托管服务。
单击下一步:配置服务。
在基本信息区域,填写服务的基本信息。
在服务部署区域,配置服务所需的资源。
配置项
参数值
租户类型
单租户
用户类型
阿里云
部署地域
华东1(杭州)
录入方式
手动录入模板
部署方式
ROS
模板内容
选择YAML页签,并输入模板内容。
此处模板中定义了如何创建一个MySQL数据库服务,并设置了用户在创建服务实例时需要填写数据库的参数和创建完成后输出的信息。模板内容的详细信息,请参见服务模板示例。
套餐设置
创建一个套餐。
参数映射关系
将模板中
RegionId
和VpcId
进行映射;将ZoneId
和vSwitchId
进行映射。隐藏参数
VpcId、vSwitchId和EcsInstanceType。
该部分参数不需要对用户透出,因此设置为隐藏。
角色名称
ComputeNestDeploy
在服务运维(选填)区域,配置服务的运维功能。
在运维区域,选中需要给用户授权并选中全部权限。
单击添加自定义运维操作,在弹出的添加自定义运维操作弹窗中选中OOS模板后,设置如下信息。
配置项
参数值
操作名称
修改密码
操作者
全部
当参数选择全部时,服务商和用户都能进行此项运维操作。
当参数选择服务商时,仅服务商能进行此项运维操作。
录入方式
手动录入
模板内容
填写OOS模板定义运维操作的内容。
在运维模板中,定义用户修改密码的操作,用户在进行修改密码时,只需输入原密码和新密码即可,计算巢会自动调用模板中的内容,将原密码替换为新密码。模板内容的详情信息,请参见运维模板示例。
重要在运维模板中,在定义实例筛选值时,需要使用伪参数(
acs:computenest:serviceInstanceId
)作为标签,筛选目标实例。否则在进行运维操作时,可能会将运维操作执行到其他服务实例的ECS实例上。单击确定。
单击创建服务。
步骤二:创建并运维服务实例
创建服务实例。
创建服务实例的详细信息,请参见创建全托管服务实例。
运维服务实例。
找到您需要运维的服务实例,单击服务实例名称,进入服务实例详情页。
单击运维管理,进入运维管理页签。
单击服务实运维区域的修改密码,并在弹出的创建自定义任务弹窗中,输入当前密码和新密码,并单击下一步。
确认信息无误后,单击创建。
查看运维结果。
创建运维操作后,可以返回运维管理页签中,查看运维操作结果。
服务模板示例
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