compute-nest-best-practice/opensource/mysql/template.yaml (415 lines of code) (raw):

ROSTemplateFormatVersion: '2015-09-01' Description: zh-cn: 该模版用于自动化部署ECS实例,包括系统与数据盘配置、网络设置、付费方式选择及安全组管理,同时初始化实例为MySQL服务器,支持公网访问配置与带宽控制,提供全面的云资源快速搭建解决方案。 en: This template facilitates automated deployment of ECS instances, encompassing system and data disk configurations, network setups, payment method selections, as well as security group management. It further initiates instances as MySQL servers, with support for public access configurations and bandwidth throttling, offering a comprehensive solution for rapid cloud resource provisioning. # 定义参数 Parameters: # 可用区 ZoneId: Type: String AssociationProperty: ALIYUN::ECS::Instance:ZoneId Label: en: VSwitch Available Zone zh-cn: 可用区 # 付费类型:按量付费/包年包月 PayType: Type: String Label: en: ECS Instance Charge Type zh-cn: 付费类型 Default: PostPaid AllowedValues: - PostPaid - PrePaid AssociationProperty: ChargeType AssociationPropertyMetadata: LocaleKey: InstanceChargeType # 购买资源时长周期,只在付费类型为包年包月时显示 PayPeriodUnit: Type: String Label: en: Pay Period Unit zh-cn: 购买资源时长周期 Default: Month AllowedValues: - Month - Year AssociationProperty: PayPeriodUnit AssociationPropertyMetadata: Visible: Condition: Fn::Not: Fn::Equals: - ${PayType} - PostPaid # 购买资源时长,只在付费类型为包年包月时显示 PayPeriod: Type: Number Label: en: Period zh-cn: 购买资源时长 Default: 1 AllowedValues: - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 AssociationProperty: PayPeriod AssociationPropertyMetadata: Visible: Condition: Fn::Not: Fn::Equals: - ${PayType} - PostPaid # 数据盘类型 DataDiskCategory: Type: String AllowedValues: - cloud_efficiency # 高效云盘 - cloud_ssd # SSD云盘 - cloud_essd # ESSD云盘 Default: cloud_essd Label: en: Data Disk Type zh-cn: 数据盘类型 AssociationPropertyMetadata: LocaleKey: DiskCategory # 数据盘空间 DataDiskSize: Type: Number Label: en: Data Disk Space zh-cn: 数据盘空间 MinValue: 20 MaxValue: 500 Default: 40 # 专有网络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实例类型 AutoCreateSecurityGroup: Type: Boolean Default: true Label: zh-cn: 自动创建安全组 en: auto create security group SecurityGroupId: Type: String AssociationProperty: ALIYUN::ECS::SecurityGroup::SecurityGroupId AssociationPropertyMetadata: VpcId: ${VpcId} Visible: Condition: Fn::Equals: - ${AutoCreateSecurityGroup} - false Default: '' Description: en: Please search the business security group ID starting with(sg-xxx)from console-ECS-Network & Security zh-cn: 现有业务安全组的实例ID Label: en: Business Security Group ID zh-cn: 业务安全组ID EcsInstanceType: Type: String Label: en: Instance Type zh-cn: 实例类型 AssociationProperty: ALIYUN::ECS::Instance::InstanceType AssociationPropertyMetadata: ZoneId: ${ZoneId} InstanceChargeType: ${InstanceChargeType} 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 AssociationProperty: ALIYUN::ECS::Instance::Password SystemDiskCategory: Type: String AllowedValues: - cloud_efficiency # 高效云盘 - cloud_ssd # SSD云盘 - cloud_essd # ESSD云盘 Default: cloud_essd Label: en: System Disk Type zh-cn: 系统盘类型 AssociationPropertyMetadata: LocaleKey: DiskCategory SystemDiskSize: Default: 40 Type: Number Description: zh-cn: 系统盘大小, 取值范围:[40, 500], 单位:GB。 en: 'System disk size of each node, range of values: 40-500, units: GB.' MinValue: 40 MaxValue: 500 Label: zh-cn: 系统盘空间 en: System Disk Space AllocatePublicIp: Default: false Type: Boolean Label: zh-cn: 开启公网IP en: allocate public ip InternetMaxBandwidthOut: Default: 0 Type: Number Label: zh-cn: 流量公网带宽 en: Internet Max Bandwidth Out MinValue: 0 MaxValue: 100 Description: zh-cn: 取值范围0-100, 0为不开公网ip en: no public ip if zero AssociationPropertyMetadata: Visible: Condition: Fn::Equals: - ${AllocatePublicIp} - true InternetChargeType: Default: PayByTraffic Type: String Label: zh-cn: 流量付费类型 en: Internet Charge Type AllowedValues: - PayByBandwidth - PayByTraffic AssociationPropertyMetadata: LocaleKey: InternetChargeType Visible: Condition: Fn::Equals: - ${AllocatePublicIp} - true # 数据库root账户密码 MySQLPassword: # 查询该参数时只输出星号(*) 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 Conditions: IfAutoCreateSecurityGroup: Fn::Equals: - Ref: AutoCreateSecurityGroup - true IfAllocatePublicIp: Fn::Equals: - Ref: AllocatePublicIp - true # 定义资源 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: SecurityGroupName: Ref: ALIYUN::StackName SecurityGroupIngress: - Priority: 1 PortRange: 3306/3306 NicType: internet SourceCidrIp: 0.0.0.0/0 IpProtocol: tcp VpcId: Ref: VpcId # Ecs实例 EcsInstance: Type: ALIYUN::ECS::Instance Properties: ZoneId: Ref: ZoneId # I/O优化实例 IoOptimized: optimized DiskMappings: - Category: Ref: DataDiskCategory Device: /dev/xvdb Size: Ref: DataDiskSize SystemDiskSize: Ref: SystemDiskSize # 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 # 在新分区上创建文件系统 mkfs.ext4 /dev/vdb1 # 创建目录,MySQL将安装在该目录下 mkdir /data # 挂载文件系统 mount /dev/vdb1 /data # 向 /etc/fstab 写入新分区信息 echo /dev/vdb1 /data ext4 defaults,nodelalloc,noatime 0 2 >> /etc/fstab cd /data/ # 启动MySQL服务 rm -f mysql-community-release-el6-5.noarch.rpm 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 rm ./test.sql # 将MySQL的配置和数据路径移动到数据盘上 systemctl stop mysqld rsync -av /var/lib/mysql /data # 修改配置文件 sed -i 's/\/var\/lib/\/data/g' /etc/my.cnf echo -e '\n' >> /etc/my.cnf echo '[client]' >> /etc/my.cnf echo 'port=3306' >> /etc/my.cnf echo 'socket=/data/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: MySQLPassword # 付费方式:按量付费 InstanceChargeType: Ref: PayType PeriodUnit: Ref: PayPeriodUnit Period: Ref: PayPeriod # 系统盘类型 SystemDiskCategory: cloud_essd # 实例名 InstanceName: Ref: ALIYUN::StackName VpcId: Ref: VpcId SecurityGroupId: Fn::If: - IfAutoCreateSecurityGroup - Ref: EcsSecurityGroup - Ref: SecurityGroupId VSwitchId: Ref: VSwitchId # 指定CentOS 7.9镜像,如果修改镜像,UserData脚本需要进行适配 ImageId: centos_7 InstanceType: Ref: EcsInstanceType # Ecs登录密码 Password: Ref: InstancePassword # 是否为实例分配公网IP AllocatePublicIP: Ref: AllocatePublicIp InternetMaxBandwidthOut: Fn::If: - IfAllocatePublicIp - Ref: InternetMaxBandwidthOut - 0 # 定义输出 Outputs: # 将数据库连接地址显示在控制台 DBConnectionPublicAddress: Condition: IfAllocatePublicIp Value: # 将Ecs的公网IP拼接成数据库连接地址 Fn::Sub: - mysql://${Domain}:3306 - Domain: Fn::GetAtt: - EcsInstance - PublicIp # 将数据库连接地址显示在控制台 DBConnectionPrivateAddress: Condition: IfAllocatePublicIp Value: # 将Ecs的公网IP拼接成数据库连接地址 Fn::Sub: - mysql://${Domain}:3306 - Domain: Fn::GetAtt: - EcsInstance - PrivateIp # 定义元数据 Metadata: ALIYUN::ROS::Interface: # 定义资源分组,创建服务实例时,同一分组的参数分布在一起 ParameterGroups: - Parameters: - ZoneId - Password Label: en: Basic Configuration zh-cn: 基础配置 - Parameters: - PayType - PayPeriodUnit - PayPeriod Label: en: PayType Configuration zh-cn: 付费类型配置 - Parameters: - VpcId - VSwitchId - AutoCreateSecurityGroup - SecurityGroupId Label: default: zh-cn: 选择已有基础资源配置 en: Choose existing Infrastructure Configuration - Parameters: - EcsInstanceType - SystemDiskCategory - SystemDiskSize - DataDiskCategory - DataDiskSize - InstanceCount - InstancePassword Label: default: en: Instance zh-cn: ECS实例配置 - Parameters: - AllocatePublicIp - InternetChargeType - InternetMaxBandwidthOut Label: default: en: Network Configurate zh-cn: ECS网络配置 - Parameters: - MySQLPassword Label: default: en: MYSQL Configuration zh-cn: MYSQL配置