文档

实例自定义数据

更新时间:

实例自定义数据可用于管理ECS实例的启动行为或者向实例传入普通数据。本文介绍如何将ECS实例自定义数据传入ECS实例。

实例自定义数据介绍

Linux实例和Windows实例均支持实例自定义数据功能,主要有以下用途:

  • 作为实例自定义脚本在启动实例时执行,实现自动化配置实例,例如自动获取软件资源包、开启服务、打印日志、安装依赖包、初始化Web服务环境等操作。

  • 仅作为普通数据传入实例,方便您在实例中使用这些数据。

实例自定义数据可以通过不同类型的脚本编写,然后在创建实例时输入脚本内容即可传入实例。具体操作,请参见将实例自定义数据传入实例(Linux)将实例自定义数据传入实例(Windows)

您可以通过实例元数据查看已传入实例的自定义数据。具体操作,请参见实例元数据

使用限制

  • 仅网络类型为专有网络VPC的实例支持实例自定义数据功能。

  • 实例必须使用公共镜像或基于公共镜像创建的自定义镜像,且必须为以下镜像之一:

    • Alibaba Cloud Linux、CentOS、CentOS Stream、Ubuntu、SUSE Linux Enterprise Server、Red Hat Enterprise Linux、OpenSUSE、Debian、AlmaLinux、Rocky Linux、Fedora

    • Windows Server 2008 R2及更高版本

  • 在售的实例规格均支持实例自定义数据功能。但已停售的实例规格中,仅I/O优化实例支持实例自定义数据功能,更多信息,请参见已停售的实例规格

将实例自定义数据传入实例(Linux)

操作步骤

  1. 准备实例自定义数据。

    您可以通过以下几种常用的脚本类型准备Linux实例的自定义数据,不同类型的脚本说明如下。

    说明
    • 重启实例、更换操作系统、重新初始化系统盘时,cloud-init需要判断当前启动是否是作为一个新实例的第一次启动来运行脚本。它通过判断当前系统上是否存在缓存目录,且缓存是否指向了当前实例的实例ID来判断当前实例系统是否为第一次启动, 具体详情请参见https://cloudinit.readthedocs.io/en/latest/explanation/boot.html#first-boot-determination

      • 在第一次启动时,会执行运行频率为once-per-instance的配置,即这些配置在每台实例上只运行一次。

      • 在该实例后续重启系统时,cloud-init服务会执行频率为always的配置,即这些配置在系统每次启动时都会运行。

    • 如果您采用Include文件或Gzip压缩内容的方式,需要使用存储服务进行上传脚本获取脚本链接、设置链接有效期等操作。推荐您使用阿里云对象存储OSS,具体操作,请参见OSS文档和基于最后一次修改时间的生命周期规则。您也可以阅读cloud-init文档了解更多准备实例自定义数据的方式,请参见User-Data Formats

    User-Data脚本

    说明

    当User-Data执行遇到问题时,可以通过云助手公共命令ACS-ECS-UserData-Check-for-linux.sh来获取失败相关的错误日志。如果返回有错误信息表示脚本执行有问题,如果没有返回错误信息表示执行没有报错,需要排查其他方面。关于云助手公共命令的更多信息,请参见查看和执行公共命令

    • 特点

      User-Data脚本传入Linux实例后直接作为Shell脚本执行。User-Data脚本具有以下特点:

      • 首行以#!开头。

      • 仅在实例首次启动时运行一次。

    • 示例脚本

      #!/bin/sh
      echo "Hello World. The time is now $(date -R)!" | tee /root/userdata_test.txt

      示例脚本表示在实例首次启动时向userdata_test.txt写入系统时间。

    • 运行频率

      • 重启实例:仅在实例首次启动时运行一次,重启实例不会自动运行。

      • 更换操作系统:自动运行。

      • 重新初始化系统盘:自动运行。

      说明

      如果更换操作系统使用的是自定义镜像且来源于原实例,或实例的系统盘来源于原实例,则更换操作系统、重新初始化系统盘时,系统会判断实例不是初次启动,因为脚本不会自行执行。

    Cloud Config数据

    重要

    Cloud Config是通过用户数据完成某些任务的最简单方法。当您使用cloud-init执行某些任务时,推荐使用Cloud Config的配置方式。

    • 特点

      以Cloud Config数据的形式编写内容可以方便地为实例预先配置一些服务,例如更新yum源、导入SSH密钥、安装依赖包等。Cloud Config数据具有以下特点:

      • 首行为#cloud-config,且起始位置不能有空格。

      • 必须遵循YAML语法编写内容。

    • 示例脚本

      #cloud-config
      apt:
       primary:
       - arches: [default]
       uri: https://us.archive.ubuntu.com/ubuntu/
       bootcmd:
       - echo "Hello World. The time is now $(date -R)!" | tee /root/userdata_test.txt

      示例脚本表示修改默认的软件源,并在实例每次启动时向userdata_test.txt写入最新的系统时间。

    • 运行频率

      • 重启实例:由配置的模块决定。例如Apt模块配置每台实例仅运行一次,Bootcmd模块在实例每次启动时都会运行。

      • 更换操作系统:自动运行。

      • 重新初始化系统盘:自动运行。

      说明

      如果更换操作系统使用的是自定义镜像且来源于原实例,或实例的系统盘来源于原实例,则更换操作系统/重新初始化系统盘时,系统会判断实例不是初次启动,因此不会自行运行频率为once-per-instance的脚本。

    Include文件

    • 特点

      Include文件包含一个或多个脚本链接,脚本链接按行分隔。实例启动时,cloud-init会逐个读取脚本链接以及脚本的内容。如果在读取某一个脚本的内容时出错,则停止读取剩余的脚本。Include文件具有以下特点:

      • 首行为#include,且起始位置不能有空格。

      • 每个脚本内容的大小在Base64编码前不能超过16 KB。

    • 示例脚本

      #include
      https://ecs-image-test.oss-cn-hangzhou.aliyuncs.com/userdata/myscript.sh

      示例脚本表示Include文件包含一个脚本链接,运行频率由脚本的类型决定。例如该脚本为User-Data脚本,则仅在实例首次启动时运行一次。

    • 运行频率

      • 重启实例:由脚本类型和模块类型决定。例如链接的脚本类型为User-Data脚本,则仅在实例首次启动时运行一次。

      • 更换操作系统:自动运行。

      • 重新初始化系统盘:自动运行。

      说明

      如果更换操作系统使用的是自定义镜像且来源于原实例,或实例的系统盘来源于原实例,则更换操作系统/重新初始化系统盘时,系统会判断实例不是初次启动,因此不会自行运行频率为once-per-instance的脚本。

    Gzip压缩内容

    • 特点

      如果您的User-Data脚本、Cloud Config数据和Include文件内容的大小可能超过16 KB,可以采用Gzip压缩内容(.gz格式)并做成链接,然后以Include文件的形式输入。cloud-init会自动解压Gzip压缩内容,运行解压后内容的效果和直接传入后运行没有区别。Gzip压缩内容具有以下特点:

      • 首行为#include,且起始位置不能有空格。

      • 每个压缩内容的大小在Base64编码前不能超过16 KB。

    • 示例脚本

      #include
      https://ecs-image-test.oss-cn-hangzhou.aliyuncs.com/userdata/myscript.gz

      示例脚本表示Include文件包含一个Gzip压缩内容链接,cloud-init读取该Gzip压缩内容后会自动解压并运行,运行频率由脚本的类型决定。例如该Gzip压缩内容由User-Data脚本压缩得到,则仅在实例首次启动时运行一次。

    • 运行频率

      • 重启实例:由脚本类型和模块类型决定。例如Gzip压缩内容链接的脚本类型为User-Data脚本,则仅在实例首次启动时运行一次。

      • 更换操作系统:自动运行。

      • 重新初始化系统盘:自动运行。

      说明

      如果更换操作系统使用的是自定义镜像且来源于原实例,或实例的系统盘来源于原实例,则更换操作系统/重新初始化系统盘时,系统会判断实例不是初次启动,因此不会自行运行频率为once-per-instance的脚本。

    Upstart Job

    说明

    如需使用Upstart Job,您需要为实例安装upstart服务,支持采用upstart服务管理启动行为的操作系统有CentOS 6、Ubuntu 10/12/14以及Debian 6/7。

    • 特点

      Upstart是一个事件驱动型的初始化系统,Upstart Job是一个配置文件,定义了一个服务或任务何时启动、停止和如何行为。它通常放置在/etc/init/目录下,文件扩展名为.conf。Upstart Job具有以下特点:首行为#upstart-job,且起始位置不能有空格。

    • 示例脚本

      #upstart-job
      description "upstart test"
      start on runlevel [2345] #在运行级别2、3、4、5执行
      stop on runlevel [!2345] #在运行级别2、3、4、5以外不执行
      exec echo "Hello World. The time is now $(date -R)!" | tee /root/output.txt

      示例脚本表示在系统进入指定的运行级别时输出一条包含时间戳的消息,并将该消息记录到/root/output.txt文件中。当系统离开这些运行级别时,作业会停止执行。

    • 运行频率

      • 重启实例:实例每次启动都会自动运行。

      • 更换操作系统:自动运行。

      • 重新初始化系统盘:自动运行。

      说明

      如果更换操作系统使用的是自定义镜像且来源于原实例,或实例的系统盘来源于原实例,则更换操作系统/重新初始化系统盘时,系统会判断实例不是初次启动,因此不会自行运行频率为once-per-instance的脚本。

  2. 将实例自定义数据传入实例。

    • 创建实例时传入实例自定义数据

      展开高级选项,在自定义数据区域输入实例自定义数据。如果实例自定义数据已进行Base64编码,请选中输入已采用Base64编码

        说明
        • 如果选中输入已采用Base64编码:输入的自定义数据必须为Base64编码形式,且在进行Base64编码前自定义数据内容的大小不能超过16 KB。

        • 如果不选中输入已采用Base64编码:您可以输入未经过Base64编码的实例自定义数据,控制台会自动进行Base64编码。

      实例首次启动时向指定文件写入系统时间的示例如下图所示。

      image

    • 修改存量实例的自定义数据

      实例页面,选择icon1 > 实例设置 > 设置用户数据,然后在用户数据区域输入新的实例自定义数据。

      说明

      对于按量付费实例,如果您需要在修改自定义数据后立即启动实例,建议停止模式设置为普通停机模式

      实例每次启动时向指定文件写入最新系统时间的示例如下图所示。

      image

  3. 查看传入实例的内容和运行效果。

    1. 远程连接ECS实例。

      具体操作,请参见通过密码或密钥认证登录Linux实例

    2. 通过实例元数据查看内容。

      curl http://100.100.100.200/latest/user-data

      以查看步骤2中的创建实例时传入实例自定义数据为例,如下图所示,内容一致表明实例自定义数据已成功传入实例。view-user-data

    3. 查看运行效果。

      cat userdata_test.txt

      运行效果和内容有关,向指定文件写入系统时间的效果如下图所示。

      view-result

脚本使用示例

示例一:使用User-Data脚本自定义yum源、NTP服务和DNS服务

系统会在实例启动时自动配置默认的yum源、NTP服务和DNS服务,您可以使用实例自定义数据更改默认的yum源、NTP服务和DNS服务,但请注意:

  • 如果您自定义了yum源,阿里云官方不再提供yum源相关支持。

  • 如果您自定义了NTP服务,阿里云官方不再提供相关时间同步服务。

适用于CentOS 7.2的示例User-Data脚本如下:

#!/bin/sh
# Modify DNS
echo "nameserve8.8.X.X.8" | tee /etc/resolv.conf
# Modify yum repo and update
rm -rf /etc/yum.repos.d/*
touch myrepo.repo
echo "[base]" | tee /etc/yum.repos.d/myrepo.repo
echo "name=myrepo" | tee -a /etc/yum.repos.d/myrepo.repo
echo "baseurl=https://mirror.centos.org/centos" | tee -a /etc/yum.repos.d/myrepo.repo
echo "gpgcheck=0" | tee -a /etc/yum.repos.d/myrepo.repo
echo "enabled=1" | tee -a /etc/yum.repos.d/myrepo.repo
yum update -y
# Modify NTP Server
echo "server ntp1.aliyun.com" | tee /etc/ntp.conf
systemctl restart ntpd.service
说明
  • 其中的URL仅为示例,请按您的实际需要替换。

  • 您也可以使用Cloud Config数据更改yum源,但是不够灵活,不能适配阿里云已对部分yum源进行预配置的情况,建议使用User-Data脚本。

在创建实例时设置实例自定义数据,启动后登录实例查看效果,确认实例的yum源、NTP服务和DNS服务配置符合预期,如下所示。

[root@iZbp1csxtw7jo9zp12s**** ~]# cat /etc/yum.repos.d/myrepo.repo
[base]
name=myrepo
baseurl=https://mirror.centos.org/centos
gpgcheck=0
enabled=1
[root@iZbp1csxtw7jo9zp12s**** ~]# cat /etc/resolv.conf
nameserver 8.8.X.X
[root@iZbp1csxtw7jo9zp12s**** ~]# ping www.baidu.com
PING www.a.shifen.com (14.215.XX.XX) 56(84) bytes of data.
64 bytes from 14.215.XX.XX (14.215.XX.XX): icmp_seq=1 ttl=52 time=26.3 ms
64 bytes from 14.215.XX.XX (14.215.XX.XX): icmp_seq=2 ttl=52 time=26.3 ms
64 bytes from 14.215.XX.XX (14.215.XX.XX): icmp_seq=3 ttl=52 time=26.2 ms
^Z
[2]+  Stopped                 ping www.baidu.com
[root@iZbp1csxtw7jo9zp12s**** ~]# cat /etc/ntp.conf
server ntp1.aliyun.com
[root@iZbp1csxtw7jo9zp12s**** ~]# systemctl status ntpd.service
● ntpd.service - Network Time Service
   Loaded: loaded (/usr/lib/systemd/system/ntpd.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2021-09-06 14:53:19 CST; 13min ago
 Main PID: 5795 (ntpd)
   CGroup: /system.slice/ntpd.service
           └─5795 /usr/sbin/ntpd -u ntp:ntp -g

Sep 06 14:53:19 iZbp1cjdaurreftzgpgvqoZ ntpd[5795]: Listen and drop on 1 v6wildcard :: UDP 123
Sep 06 14:53:19 iZbp1cjdaurreftzgpgvqoZ ntpd[5795]: Listen normally on 2 lo 127.0.XX.XX UDP 123
Sep 06 14:53:19 iZbp1cjdaurreftzgpgvqoZ ntpd[5795]: Listen normally on 3 eth0 192.168.XX.XX UDP 123
Sep 06 14:53:19 iZbp1cjdaurreftzgpgvqoZ ntpd[5795]: Listening on routing socket on fd #20 for interface updates
Sep 06 14:53:19 iZbp1cjdaurreftzgpgvqoZ ntpd[5795]: 0.0.XX.XX c016 06 restart
Sep 06 14:53:19 iZbp1cjdaurreftzgpgvqoZ ntpd[5795]: 0.0.XX.XX c012 02 freq_set kernel 0.000 PPM
Sep 06 14:53:19 iZbp1cjdaurreftzgpgvqoZ ntpd[5795]: 0.0.XX.XX c011 01 freq_not_set
Sep 06 14:56:34 iZbp1cjdaurreftzgpgvqoZ ntpd[5795]: 0.0.XX.XX c61c 0c clock_step +0.464773 s
Sep 06 14:56:35 iZbp1cjdaurreftzgpgvqoZ ntpd[5795]: 0.0.XX.XX c614 04 freq_mode
Sep 06 14:56:36 iZbp1cjdaurreftzgpgvqoZ ntpd[5795]: 0.0.XX.XX c618 08 no_sys_peer

示例二:使用User-Data脚本自定义管理员账号

Linux实例默认使用root用户作为管理员,您可以使用实例自定义数据使用其他用户作为管理员。

适用于CentOS 7.2的示例User-Data脚本如下:

#!/bin/sh
useradd test
echo "test   ALL=(ALL)        NOPASSWD:ALL" | tee -a /etc/sudoers
mkdir /home/test/.ssh
touch /home/test/.ssh/authorized_keys
echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCRnnUveAis****" | tee -a /home/test/.ssh/authorized_keys
说明

请使用您的公钥替换示例中的公钥ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCRnnUveAis****

示例User-Data脚本的效果如下:

  • 创建名为test的用户,并将其作为管理员账号使用。

  • 仅允许该用户使用SSH密钥对远程连接实例,不能使用用户密码。

  • 如果该用户执行需要管理员权限的操作,通过sudo命令提权即可,无需输入密码。

在创建实例时设置实例自定义数据,启动后可以通过test用户和SSH密钥对远程连接实例,如果尝试使用密码登录会报错。连接实例后,可以通过sudo命令提权执行需要管理员权限的操作,示例如下。

[test@iZbp1csxtw7jo9zp12s**** ~]$ cd /root
-bash: cd: /root: Permission denied
[test@iZbp1csxtw7jo9zp12s**** ~]$ sudo cd /root
[test@iZbp1csxtw7jo9zp12s**** ~]$ 

将实例自定义数据传入实例(Windows)

  1. 准备实例自定义数据。

    您可以通过Bat和PowerShell脚本准备Windows实例的自定义数据,不同类型的脚本说明如下。

    Bat脚本

    • 特点

      • 首行为[bat],且起始位置不能有空格。

      • 只能输入半角字符,不能有多余字符。

    • 示例脚本

      [bat]
      echo "bat test" > C:\userdata_test.txt

      示例脚本表示在实例首次启动时向userdata_test.txt写入内容"bat test"

    • 运行频率

      • 重启实例:首次启动时运行一次,重启实例不会自动运行。

      • 更换操作系统:自动运行。

      • 重新初始化系统盘:自动运行。

      说明

      如果更换操作系统使用的是自定义镜像且来源于原实例,或实例的系统盘来源于原实例,则更换操作系统/重新初始化系统盘时,系统会判断实例不是初次启动,因此不会自行运行频率为once-per-instance的脚本。

    PowerShell脚本

    • 特点

      • 首行为[powershell],且起始位置不能有空格。

      • 只能输入半角字符,不能有多余字符。

    • 示例脚本

      [powershell]
      write-output "powershell test" | Out-File C:\userdata_test.txt

      示例脚本表示在实例首次启动时向userdata_test.txt写入内容powershell test

    • 运行频率

      • 重启实例:首次启动时运行一次,重启实例不会自动运行。

      • 更换操作系统:自动运行。

      • 重新初始化系统盘:自动运行。

      说明

      如果更换操作系统使用的是自定义镜像且来源于原实例,或实例的系统盘来源于原实例,则更换操作系统/重新初始化系统盘时,系统会判断实例不是初次启动,因此不会自行运行频率为once-per-instance的脚本。

  2. 将实例自定义数据传入实例。

    • 创建实例时传入实例自定义数据

      展开高级选项区域,在自定义数据区域输入实例自定义数据。如果实例自定义数据已进行Base64编码,请选中输入已采用Base64编码

      说明
      • 如果选中输入已采用Base64编码:输入的自定义数据必须为Base64编码形式,且在进行Base64编码前自定义数据内容的大小不能超过16 KB。

      • 如果不选中输入已采用Base64编码:您可以输入未经过Base64编码的实例自定义数据,控制台会自动进行Base64编码。

      向指定文件写入内容的示例如下图所示。

      image

    • 为已有实例修改实例自定义数据

      实例页面中,选择icon1 > 实例设置 > 设置用户数据,然后在用户数据区域输入新的实例自定义数据。

      说明

      对于按量付费实例,如果您需要在修改自定义数据后立即启动实例,建议停止模式设置为保留并收费

      向指定文件写入内容的示例如下图所示。

      image

      说明

      修改Windows实例自定义数据后,启动实例时不会重新运行新的实例自定义数据。

  3. 查看传入实例的内容和运行效果。

    1. 远程连接ECS实例。

      具体操作,请参见通过密码或密钥认证登录Windows实例

    2. 查看实例自定义数据内容。

      Invoke-RestMethod http://100.100.100.200/latest/user-data

      以查看步骤2中的创建实例时传入实例自定义数据为例,如下图所示,内容一致表明实例自定义数据已成功传入实例。view-userdata

    3. 查看运行效果。

      运行效果和内容有关,向指定文件写入内容的效果如下图所示。powershell-sample

  • 本页导读 (1)
文档反馈