当您在创建RDS Custom实例时需要自动完成系统配置或执行业务脚本(例如预装Nginx/Docker、修改主机名等),可通过设置自定义数据参数实现。
自定义数据介绍
自定义数据是上传至RDS Custom实例的脚本或配置文件,用于在实例首次启动时自动执行初始化任务。RDS Custom实例使用cloud-init
组件实现实例初始化动作,通过读取用户提供的自定义数据以完成自定义配置。常见的数据格式:
User-Data脚本:适用于执行简单的Shell命令。
Cloud Config数据:适用于通过YAML格式进行更结构化的配置,如管理软件包、用户和网络等。
Include文件:通过
#include
指令引用一个或多个User-Data脚本或Cloud Config数据的链接(例如对象存储OSS链接)。Gzip压缩内容:当User-Data脚本或Cloud Config超过32 KB时,可将其压缩为
.gz
格式后,通过Include文件的形式引用。MIME multi-part文件:将多种不同类型的数据(如一个Cloud Config数据和一个User-Data脚本)打包在同一个文件中提交。
自定义数据的运行频率取决于数据类型和操作场景:
数据格式 | 启动实例 | 更换操作系统 | 重新初始化系统盘 |
User-Data脚本 | 仅在首次启动实例时运行,重启实例时不再运行。 | 自动运行。 | 自动运行。 |
Cloud Config数据 | Cloud Config数据中的任务执行取决于对应模块的频率设置。
| 自动运行。 | 自动运行。 |
Include文件 | 由链接里的内容(User-Data脚本或Cloud Config数据)决定。 | 自动运行。 | 自动运行。 |
Gzip压缩内容 | 由文件内容(User-Data脚本或Cloud Config数据)决定。 | 自动运行。 | 自动运行。 |
MIME multi-part文件 | 由文件内容(User-Data脚本或Cloud Config数据)决定。 | 自动运行。 | 自动运行。 |
以下情况不会自动运行脚本:
如果更换操作系统使用的是自定义镜像且来源于原实例,更换操作系统时会判断实例不是初次启动,因此不会自动运行脚本。
如果创建使用的是自定义镜像,则创建实例时系统盘就有数据,初始化系统盘时会判断实例不是首次启动,因此不会自动运行脚本。
自定义数据格式的详细说明,可参见cloud-init文档User-Data Formats。
使用限制
实例必须使用公共镜像或基于公共镜像创建的自定义镜像,且操作系统需为以下类型之一:
Alibaba Cloud Linux、CentOS Stream、Ubuntu、Debian
创建实例时使用自定义数据
步骤一:准备自定义数据
User-Data脚本
格式
首行均以
#!
开头。User-Data脚本示例
运行自定义脚本(在实例首次启动时,向userdata_test.txt文件写入系统时间)
#!/bin/sh echo "Hello World. The time is now $(date -R)!" | tee /root/userdata_test.txt
自定义实例软件源、DNS解析配置及时间同步服务
以下示例以CentOS Stream 9为例,实际使用中请根据您的操作系统进行相应配置替换。
重要系统会在实例启动时自动配置默认的yum源、NTP服务和DNS服务,您可以使用实例自定义数据更改默认的yum源、NTP服务和DNS服务,但请注意:
如果您自定义了yum源,阿里云官方不再提供yum源相关支持。
如果您自定义了NTP服务,阿里云官方不再提供相关时间同步服务。
#!/bin/sh # Modify DNS echo "nameserver 114.114.114.114" | tee /etc/resolv.conf # Modify yum repo and update cp /etc/yum.repos.d/centos.repo /etc/yum.repos.d/centos.repo.bak cp /etc/yum.repos.d/centos-addons.repo /etc/yum.repos.d/centos-addons.repo.bak sed -i "s@http://mirrors.cloud.aliyuncs.com/centos-stream/@https://mirror.stream.centos.org/@g" /etc/yum.repos.d/centos.repo sed -i "s@http://mirrors.cloud.aliyuncs.com/centos-stream/@https://mirror.stream.centos.org/@g" /etc/yum.repos.d/centos-addons.repo yum update -y # Modify NTP Server echo "server ntp1.aliyun.com" | tee /etc/ntp.conf systemctl restart ntpd.service
说明其中
114.114.114.114
为DNS服务器地址、https://mirror.stream.centos.org
为CentOS Stream的yum仓库地址、server ntp1.aliyun.com
为阿里云的NTP服务器地址,请您根据实际环境替换。您也可以使用Cloud Config数据更改yum源,但是不够灵活,不能适配阿里云已对部分yum源进行预配置的情况,建议使用User-Data脚本。
自定义管理员账号
RDS Custom实例默认使用root用户作为管理员,您可通过实例自定义数据创建并配置其他用户作为管理员。
#!/bin/sh useradd test-user echo "test-user ALL=(ALL) NOPASSWD:ALL" | tee -a /etc/sudoers mkdir /home/test-user/.ssh touch /home/test-user/.ssh/authorized_keys echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCRnnUveAis****" | tee -a /home/test-user/.ssh/authorized_keys
说明请使用您的公钥替换示例中的公钥ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCRnnUveAis****。
Cloud Config数据
格式
首行为
#cloud-config
,且起始位置不能有空格。必须遵循YAML语法编写内容。
Cloud Config数据示例
自定义实例软件源
在自定义数据区域输入以下内容,以配置自定义实例软件源。示例中使用Ubuntu镜像创建实例,如果您使用其他镜像,请替换为对应模块的配置内容。
#cloud-config apt: preserve_sources_list: false disable_suites: - $RELEASE-updates - backports - $RELEASE - mysuite primary: - arches: - amd64 - i386 - default uri: http://us.archive.ubuntu.com/ubuntu
配置自动安装nginx服务
在自定义数据区域输入如下内容,以配置实例自动安装nginx服务。
#cloud-config packages: - nginx runcmd: - systemctl start nginx.service
配置自定义主机名
在自定义数据区域输入如下内容,以自定义设置主机名。
#cloud-config hostname: my-instance fqdn: my-instance.localdomain
配置自动运行自定义脚本
在自定义数据区域输入如下内容,以配置实例每次启动时自动运行Shell脚本。
#cloud-config bootcmd: - echo "Hello World. The time is now $(date -R)!" | tee /root/userdata_test.txt
Include文件
格式
首行为
#include
,且起始位置不能有空格。Include文件示例
#include https://ecs-image-test.oss-cn-hangzhou.aliyuncs.com/userdata/myscript.sh
Gzip压缩内容
格式
首行为
#include
,且起始位置不能有空格。Gzip压缩内容示例
#include https://rc-image-test.oss-cn-hangzhou.aliyuncs.com/userdata/myscript.gz
MIME multi-part文件
格式
首行为
Content-Type:multipart/mixed:boundary="****"
,boundary可自定义,且起始位置不能有空格。第二行指定版本
MIME-Version:1.0
,该字段通常在每个MIME消息中是必需的。
MIME multi-part文件示例
Content-Type: multipart/mixed; boundary="//" MIME-Version: 1.0 --// Content-Type: text/cloud-config; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="cloud-config.txt" #cloud-config runcmd: - [ mkdir, /test-cloudinit ] write_files: - path: /test-cloudinit/cloud-init.txt content: | Created by cloud-init append: true --// Content-Type: text/x-shellscript; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="userdata.txt" #!/bin/bash mkdir test-userscript touch /test-userscript/userscript.txt echo "Created by bash shell script" >> /test-userscript/userscript.txt --//--
示例MIME multi-part文件包含cloud-init指令和一个Bash Shell脚本:
cloud-init指令创建一个文件(
/test-cloudinit/cloud-init.txt
),并写入Created by cloud-init
。Bash Shell脚本创建一个文件(
/test-userscript/userscript.txt
),并写入Created by bash shell script
。
步骤二:创建实例时使用自定义数据
通过控制台创建实例
在创建RDS Custom实例时,展开更多配置区域,在自定义数据区域输入实例自定义数据。
重要如果实例自定义数据已进行Base64编码,请勾选以上输入已采用Base64编码,且在进行Base64编码前自定义数据内容的大小不能超过32 KB。否则,无需勾选,系统会自动对内容进行Base64编码。
通过API创建实例
如果您通过API方式创建实例,请在RunRCInstances接口指定
UserData
字段。
步骤三:(可选)验证自定义数据运行效果
本文以在RDS Custom实例中传入如下User-Data脚本为例。
#!/bin/sh
echo "Hello World. The time is now $(date -R)!" | tee /root/userdata_test.txt
该示例中,User-Data脚本的效果是在实例首次启动时,向userdata_test.txt文件写入系统时间。您可以运行cat userdata_test.txt
命令来查看脚本运行效果。
查看已有实例自定义数据
您可以通过调用DescribeRCInstanceAttribute接口查询一台RDS Custom实例的自定义数据。