實例自定義數據是指用戶上傳給實例的腳本、指令或配置文件等數據,可用來完成實例初始化或其他配置,例如實例首次啟動時,自動運行服務啟動腳本、安裝軟件、打印日志等。本文介紹如何將自定義數據傳入ECS實例、修改自定義數據、如何查看自定義數據等。
實例首次啟動時會自動運行自定義數據,部分自定義數據格式還支持在Linux實例每次啟動時都運行。詳細說明,請參見自定義數據格式及運行頻率。
使用限制
實例的網絡類型必須為專有網絡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優化實例支持實例自定義數據功能,非I/O優化實例不支持該功能。更多信息,請參見已停售的實例規格。
使用自定義數據
將自定義數據傳入ECS實例
準備實例自定義數據。
支持的自定義數據格式、任務被執行頻率及其說明,請參見自定義數據格式及運行頻率。
重要自定義數據內容可不經過Base64編碼,且在未經過Base64編碼前的大小不能超過32 KB。
將自定義數據傳入ECS實例。
創建新實例時傳入:數據會在實例首次啟動時、更換操作系統、重新初始化系統盤時被執行。
修改已有實例的自定義數據:數據會在實例更換操作系統、重新初始化系統盤時被執行。
部分自定義數據格式還支持在Linux實例每次重啟時被執行。詳細說明,請參見自定義數據格式及運行頻率。
確保實例處于已停止狀態。
重要如果實例的計費方式為按量付費、網絡類型為專有網絡,停止實例時,停止模式建議選擇普通停機模式,選擇節省停機模式會因計算資源(vCPU和內存)被回收,再次啟動實例時可能因為庫存不足導致啟動失敗。更多信息,請參見節省停機模式。
在實例頁面,選擇
,然后在用戶數據區域輸入自定義數據。根據設置的腳本內容驗證自定義數據的運行效果。
說明當User-Data執行遇到問題時,可以通過云助手公共命令ACS-ECS-UserData-Check-for-linux.sh來獲取失敗相關的錯誤日志。如果返回有錯誤信息表示腳本執行有問題,如果沒有返回錯誤信息表示執行沒有報錯,需要排查其他方面。關于云助手公共命令的更多信息,請參見查看和執行公共命令。
例如我們在Linux實例中傳入了User-Data腳本,內容如下:
#!/bin/sh echo "Hello World. The time is now $(date -R)!" | tee /root/userdata_test.txt
您可以運行
cat userdata_test.txt
命令來查看效果,系統已經向userdata_test.txt
文件寫入系統時間。
創建新實例時傳入自定義數據
在實例購買頁展開高級選項區域,在自定義數據區域輸入實例自定義數據。
如果實例自定義數據已進行Base64編碼,請勾選輸入已采用Base64編碼,且在進行Base64編碼前自定義數據內容的大小不能超過32 KB。否則,無需勾選,系統會自動對內容進行Base64編碼。
修改已有實例的自定義數據
查看實例的自定義數據
自定義數據傳入實例后,您可以通過元數據或控制臺查看實例的自定義數據信息。
通過元數據獲取(普通模式)
Linux實例
curl http://100.100.100.200/latest/user-data
Windows實例
Invoke-RestMethod http://100.100.100.200/latest/user-data
通過元數據獲取(加固模式)
假設,設置元數據服務器訪問憑證有效期
為180秒。
Linux實例
TOKEN=`curl -X PUT "http://100.100.100.200/latest/api/token" -H "X-aliyun-ecs-metadata-token-ttl-seconds:180"` curl -H "X-aliyun-ecs-metadata-token: $TOKEN" http://100.100.100.200/latest/user-data
Windows實例
$token = Invoke-RestMethod -Headers @{"X-aliyun-ecs-metadata-token-ttl-seconds" = "180"} -Method PUT –Uri http://100.100.100.200/latest/api/token Invoke-RestMethod -Headers @{"X-aliyun-ecs-metadata-token" = $token} -Method GET -Uri http://100.100.100.200/latest/user-data
通過控制臺獲取
確保實例處于已停止狀態。
重要如果實例的計費方式為按量付費、網絡類型為專有網絡,停止實例時,停止模式建議選擇普通停機模式,選擇節省停機模式會因計算資源(vCPU和內存)被回收,再次啟動實例時可能因為庫存不足導致啟動失敗。更多信息,請參見節省停機模式。
在實例頁面,選擇
,然后在用戶數據區域查看已設置的自定義數據。
關于元數據的更多說明,請參見實例元數據。
Linux腳本使用示例
示例一:使用User-Data腳本自定義yum源、NTP服務和DNS服務
系統會在實例啟動時自動配置默認的yum源、NTP服務和DNS服務,您可以使用實例自定義數據更改默認的yum源、NTP服務和DNS服務,但請注意:
如果您自定義了yum源,阿里云官方不再提供yum源相關支持。
如果您自定義了NTP服務,阿里云官方不再提供相關時間同步服務。
適用于CentOS 7.2的示例User-Data腳本如下:
#!/bin/sh
# Modify DNS
echo "nameserve 8.8.X.X" | 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
其中
8.8.X.X
為DNS服務器地址、https://mirror.centos.org/centos
為CentOS的yum倉庫地址、server ntp1.aliyun.com
為阿里云的NTP服務器地址,請您根據實際環境替換。您也可以使用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**** ~]$
自定義數據格式及運行頻率
Linux實例
Linux實例是通過cloud-init組件控制實例的啟動行為。在實例首次啟動過程中,系統會自動運行自定義數據。實例重啟時,自定義數據是否會被執行,由自定義數據的格式決定。
實例啟動、更換操作系統、重新初始化系統盤時,cloud-init會判斷當前系統上是否存在緩存目錄,且緩存是否指向了當前實例的實例ID。如果一致,則表示系統是首次啟動,否則表示系統不是首次啟動。具體詳情請參見Boot stages。
常見的幾種Linux實例自定義數據格式如下:
自定義數據格式的詳細說明,可參見cloud-init文檔User-Data Formats。
如果您的User-Data腳本、Cloud Config數據或Include文件內容的大小超過32 KB,數據類型建議選擇Gzip壓縮內容。
如果任務需要在實例每次啟動時都執行,數據類型建議選擇Cloud Config數據或Upstart Job。
User-Data腳本
簡介
User-Data腳本傳入Linux實例后直接作為Shell腳本執行,且僅在實例首次啟動時運行一次。
運行頻率
啟動實例:僅在實例首次啟動時運行一次,重啟實例不會再自動運行。
更換操作系統:自動運行。
重新初始化系統盤:自動運行。
重要以下情況不會自動運行腳本:
如果更換操作系統使用的是自定義鏡像且來源于原實例,更換操作系統時會判斷實例不是初次啟動,因此不會自動運行腳本。
如果創建使用的是自定義鏡像,則創建實例時系統盤就有數據,初始化系統盤時會判斷實例不是初次啟動,因此不會自動運行腳本。
格式
首行均以
#!
開頭。User-Data腳本示例
#!/bin/sh echo "Hello World. The time is now $(date -R)!" | tee /root/userdata_test.txt
示例User-Data腳本的效果是在實例首次啟動時,向userdata_test.txt文件寫入系統時間。
Cloud Config數據
簡介
在Cloud-init中,定義了一系列的功能模塊,來完成部分需要執行的任務和配置,例如安裝軟件包、設置網絡等。執行哪些模塊及具體的執行邏輯,由Cloud Config數據決定,可從vendordata、自定義數據、內核參數中獲取。在創建ECS實例時,用戶可自定義Cloud Config數據,指定需要執行的模塊和任務,并作為自定義數據提供給實例。實例啟動時,cloud-init會讀取并解析Cloud Config數據,并按照配置文件中的指示運行對應模塊并執行配置任務,自動配置和部署ECS實例。
運行頻率
啟動實例:Cloud Config數據中的任務是否會被執行,取決于這些任務對應模塊的頻率設置。各模塊的說明,請參見Modules。
頻率為once-per-instance:僅在實例首次啟動時運行。例如配置的是Apt、Set Passwords等模塊,運行頻率為once-per-instance,重啟實例時不會運行。
頻率為always:實例每次啟動都運行。例如配置的是Bootcmd、Update Etc Hosts等模塊,運行頻率為always,實例每次啟動都運行。
更換操作系統:自動運行。
重新初始化系統盤:自動運行。
重要以下情況不會自動運行腳本:
如果更換操作系統使用的是自定義鏡像且來源于原實例,更換操作系統時會判斷實例不是初次啟動,因此不會自動運行腳本。
如果創建使用的是自定義鏡像,則創建實例時系統盤就有數據,初始化系統盤時會判斷實例不是初次啟動,因此不會自動運行腳本。
格式
首行為
#cloud-config
,且起始位置不能有空格。必須遵循YAML語法編寫內容。
Cloud Config數據示例
#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
示例Cloud Config數據的效果是修改默認的軟件源,并在實例每次啟動時向userdata_test.txt文件寫入最新的系統時間。
Include文件
簡介
通過Include文件指向一個或多個User-Data腳本或Cloud Config數據的鏈接,多個鏈接按行分隔。實例啟動時,cloud-init會逐個解析并讀取鏈接里的內容。如果在讀取某一個鏈接的內容時出錯,則停止讀取剩余的鏈接。
說明您可以通過阿里云對象存儲OSS,上傳User-Data腳本或Cloud Config數據、獲取鏈接、設置鏈接有效期等。具體操作,請參見OSS控制臺快速入門。
運行頻率
啟動實例:執行頻率由鏈接里的內容決定。例如,鏈接的內容為User-Data腳本,則僅在實例首次啟動時運行一次;腳本類型鏈接的內容為Cloud Config數據,則遵循Cloud Config數據的運行頻率。
更換操作系統:自動運行。
重新初始化系統盤:自動運行。
重要以下情況不會自動運行腳本:
如果更換操作系統使用的是自定義鏡像且來源于原實例,更換操作系統時會判斷實例不是初次啟動,因此不會自動運行腳本。
如果創建使用的是自定義鏡像,則創建實例時系統盤就有數據,初始化系統盤時會判斷實例不是初次啟動,因此不會自動運行腳本。
格式
首行為
#include
,且起始位置不能有空格。Include文件示例
#include https://ecs-image-test.oss-cn-hangzhou.aliyuncs.com/userdata/myscript.sh
示例Include文件包含一個腳本鏈接,該腳本為User-Data腳本,則僅在實例首次啟動時運行一次。
說明如果您采用Include文件或Gzip壓縮內容的方式,需要使用存儲服務上傳腳本、獲取腳本鏈接、設置鏈接有效期等操作,推薦您使用阿里云對象存儲OSS。具體操作,請參見OSS控制臺快速入門。
Gzip壓縮內容
簡介
如果您的User-Data腳本、Cloud Config數據或Include文件內容的大小超過32 KB,可以采用Gzip壓縮內容(
.gz
格式)并做成鏈接,然后以Include文件的形式輸入。cloud-init會自動解壓Gzip壓縮內容,運行解壓后內容的效果和直接傳入后運行沒有區別。說明您可以通過阿里云對象存儲OSS,上傳User-Data腳本或Cloud Config數據、獲取鏈接、設置鏈接有效期等。具體操作,請參見OSS控制臺快速入門。
運行頻率
啟動實例:由腳本類型和模塊類型決定。例如,Gzip壓縮內容鏈接的腳本類型為User-Data腳本,則僅在實例首次啟動時運行一次。
更換操作系統:自動運行。
重新初始化系統盤:自動運行。
重要以下情況不會自動運行腳本:
如果更換操作系統使用的是自定義鏡像且來源于原實例,更換操作系統時會判斷實例不是初次啟動,因此不會自動運行腳本。
如果創建使用的是自定義鏡像,則創建實例時系統盤就有數據,初始化系統盤時會判斷實例不是初次啟動,因此不會自動運行腳本。
格式
首行為
#include
,且起始位置不能有空格。Gzip壓縮內容示例
#include https://ecs-image-test.oss-cn-hangzhou.aliyuncs.com/userdata/myscript.gz
示例Gzip壓縮內容表示Include文件包含一個Gzip壓縮內容鏈接,cloud-init讀取該Gzip壓縮內容后會自動解壓并運行,該Gzip壓縮內容由User-Data腳本壓縮得到,所以僅在實例首次啟動時運行一次。
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
示例Upstart Job表示在系統進入指定的運行級別時輸出一條包含時間戳的消息,并將該消息記錄到
/root/output.txt
文件中。當系統離開這些運行級別時,作業會停止執行。
Windows實例
Windows實例是通過Vminit組件的Plugin_Main_CloudinitUserData
組件來運行自定義數據腳本,該插件僅支持在實例首次啟動時運行。更多信息,請參見Vminit組件說明。
Windows自定義數據腳本支持Bat和PowerShell兩種類型。
Bat腳本
運行頻率
啟動實例:實例首次啟動時運行一次,重啟實例不會自動運行。
更換操作系統:自動運行。
重新初始化系統盤:自動運行。
重要以下情況不會自動運行腳本:
如果更換操作系統使用的是自定義鏡像且來源于原實例,更換操作系統時會判斷實例不是初次啟動,因此不會自動運行腳本。
如果創建使用的是自定義鏡像,則創建實例時系統盤就有數據,初始化系統盤時會判斷實例不是初次啟動,因此不會自動運行腳本。
格式
首行為
[bat]
,且起始位置不能有空格。只能輸入半角字符,不能有多余字符。
寫入數據的路徑不能為
C:\Users
目錄,否則自定義數據會執行失敗。說明在Windows系統中,
C:\Users
及其子目錄是用戶配置文件和數據的默認存儲位置,需要登錄系統后才可以訪問,而在系統初始化執行userdata階段實際還未登錄系統,所以寫入數據到C:\Users
目錄會失敗。
Bat腳本示例
[bat] echo "bat test" > C:\userdata_test.txt
示例Bat腳本的效果是在實例首次啟動時向userdata_test.txt文件寫入內容
"bat test"
。
PowerShell腳本
運行頻率
啟動實例:實例首次啟動時運行一次,重啟實例不會自動運行。
更換操作系統:自動運行。
重新初始化系統盤:自動運行。
重要以下情況不會自動運行腳本:
如果更換操作系統使用的是自定義鏡像且來源于原實例,更換操作系統時會判斷實例不是初次啟動,因此不會自動運行腳本。
如果創建使用的是自定義鏡像,則創建實例時系統盤就有數據,初始化系統盤時會判斷實例不是初次啟動,因此不會自動運行腳本。
格式
首行為
[powershell]
,且起始位置不能有空格。只能輸入半角字符,不能有多余字符。
寫入數據的路徑不能為
C:\Users
目錄,否則自定義數據會執行失敗。說明在Windows系統中,
C:\Users
及其子目錄是用戶配置文件和數據的默認存儲位置,需要登錄系統后才可以訪問,而在系統初始化執行userdata階段實際還未登錄系統,所以寫入數據到C:\Users
目錄會失敗。
PowerShell腳本示例
[powershell] write-output "powershell test" | Out-File C:\userdata_test.txt
示例PowerShell腳本的效果是在實例首次啟動時向userdata_test.txt文件寫入內容
powershell test
。
相關文檔
您可以調用DescribeUserData接口查詢一臺ECS實例的自定義數據。
您也可以通過彈性伸縮的自定義數據功能,讓多臺ECS實例在啟動時自動執行配置的腳本或命令,確保ECS實例配置的一致性,簡化了運維工作。更多信息,請參見使用實例自定義數據自動配置ECS實例。
如果希望服務或腳本因程序異常、服務器重啟、掉電等被中斷時,及時恢復運行,云助手插件
ecs-tool-servicekeepalive
實現。具體操作,請參見自動恢復服務。