使用自定义数据进行实例初始化

当您在创建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数据中的任务执行取决于对应模块的频率设置。

  • once-per-instance:仅在首次启动实例时运行。

  • always:每次启动实例都运行。

自动运行。

自动运行。

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.114DNS服务器地址、https://mirror.stream.centos.orgCentOS Streamyum仓库地址、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命令来查看脚本运行效果。

view-result

查看已有实例自定义数据

您可以通过调用DescribeRCInstanceAttribute接口查询一台RDS Custom实例的自定义数据。

相关文档

创建RDS Custom实例