ECS版Mysql(支援對等串連)
ROSTemplateFormatVersion: '2015-09-01'
# 定義參數
Parameters:
# 可用性區域
ZoneId:
Type: String
AssociationProperty: ALIYUN::ECS::Instance:ZoneId
Label:
en: VSwitch Available Zone
zh-cn: 可用性區域
# 資料庫root賬戶密碼
Password:
# 查詢該參數時只輸出星號(*)
NoEcho: true
Type: String
Description:
en: 'Database root and admin account password, 8-32 characters, including uppercase and lowercase letters, numbers and special symbols (including: !@#$%^&*-+=_).'
zh-cn: 資料庫root和admin賬戶密碼,長度8-32個字元,可包含大小字母、數字及特殊符號(包含:!@#$%^&*-+=_)。
Label:
en: root and admin Account Password
zh-cn: 資料庫root和admin賬戶密碼
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
# 建立Ipv4網段
VpcCidrBlock:
Type: String
Label:
en: VPC CIDR IPv4 Block
zh-cn: 專用網路IPv4網段
Description:
zh-cn: VPC的ip位址區段範圍,<br>您可以使用以下的ip位址區段或其子網:<br><font color='green'>[10.0.0.0/8]</font><br><font
color='green'>[172.16.0.0/12]</font><br><font color='green'>[192.168.0.0/16]</font>
en: 'The ip address range of the VPC in the CidrBlock form; <br>You can use
the following ip address ranges and their subnets: <br><font color=''green''>[10.0.0.0/8]</font><br><font
color=''green''>[172.16.0.0/12]</font><br><font color=''green''>[192.168.0.0/16]</font>'
AssociationProperty: ALIYUN::VPC::VPC::CidrBlock
Default: 192.168.0.0/16
# 建立交換器網段
VSwitchCidrBlock:
Type: String
Label:
en: VSwitch CIDR Block
zh-cn: 交換器子網網段
Description:
zh-cn: 必須屬於VPC的子網段。
en: Must belong to the subnet segment of VPC.
AssociationProperty: ALIYUN::VPC::VSwitch::CidrBlock
AssociationPropertyMetadata:
VpcCidrBlock: VpcCidrBlock
Default: 192.168.1.0/24
# Ecs執行個體類型
EcsInstanceType:
Type: String
Label:
en: Instance Type
zh-cn: Ecs執行個體類型
AssociationProperty: ALIYUN::ECS::Instance::InstanceType
AllowedValues:
- ecs.c6.large
- ecs.c6.xlarge
- ecs.c6.2xlarge
- ecs.c6.4xlarge
# 定義資源
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:
VpcId:
Ref: EcsVpc
SecurityGroupIngress:
- Priority: 1
PortRange: 3306/3306
NicType: internet
SourceCidrIp: 0.0.0.0/0
IpProtocol: tcp
# Vpc
EcsVpc:
Type: ALIYUN::ECS::VPC
Properties:
CidrBlock:
Ref: VpcCidrBlock
VpcName:
Ref: ALIYUN::StackName
# 交換器
EcsVSwitch:
Type: ALIYUN::ECS::VSwitch
Properties:
ZoneId:
Ref: ZoneId
VpcId:
Ref: EcsVpc
CidrBlock:
Ref: VSwitchCidrBlock
# Ecs執行個體
EcsInstanceGroup:
Type: ALIYUN::ECS::InstanceGroup
Properties:
# I/O最佳化執行個體
IoOptimized: optimized
ZoneId:
Ref: ZoneId
DiskMappings:
- Category: cloud_essd
Device: /dev/xvdb
Size: 200
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 '{{ computenest::file::MySQL }}' -O 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
MaxAmount: 1
# 系統硬碟類型:cloud_essd
SystemDiskCategory: cloud_essd
# 執行個體名稱
InstanceName:
Ref: ALIYUN::StackName
VpcId:
Ref: EcsVpc
SecurityGroupId:
Ref: EcsSecurityGroup
VSwitchId:
Ref: EcsVSwitch
# 指定CentOS 7.9鏡像,如果修改鏡像,UserData指令碼需要進行適配
ImageId: "centos_7_9_x64_20G_alibase_20220727.vhd"
InstanceType:
Ref: EcsInstanceType
# 主機名稱
HostName:
Ref: ALIYUN::StackName
# Ecs登入密碼
Password:
Ref: Password
# 是否為執行個體分配公網IP
AllocatePublicIP: true
InternetMaxBandwidthOut: 1
# 定義輸出
Outputs:
MysqlUserName:
Label: MySQL登入使用者名稱
Value: admin
PrivateIps:
Label: 私網Ip地址
Value:
Fn::Select:
- 0
- Fn::GetAtt:
- EcsInstanceGroup
- PrivateIps
# 定義中繼資料
Metadata:
ALIYUN::ROS::Interface:
# 定義資源分組,建立服務執行個體時,同一分組的參數分布在一起
ParameterGroups:
- Parameters:
- EcsInstanceType
Label:
en: Instance Type
zh-cn: 執行個體規格
- Parameters:
- Password
Label:
en: Basic Configuration
zh-cn: 基礎配置
- Parameters:
- ZoneId
- VpcCidrBlock
- VSwitchCidrBlock
Label:
en: Network Configuration
zh-cn: 網路設定