如您希望在建立ECS執行個體時完成系統配置或運行特定業務指令碼,例如預裝Nginx、Docker等軟體或修改主機名稱等,可以通過設定自訂資料參數來實現。
自訂資料介紹
執行個體自訂資料是指使用者上傳給執行個體的指令碼、指令或設定檔等資料,可用來完成執行個體初始化或其他配置,例如,在執行個體初次開機時,自動運行服務啟動指令碼、安裝軟體、列印日誌等。自訂資料支援在執行個體初次開機時自動運行,部分自訂資料格式還支援在Linux執行個體每次啟動時都運行。詳細說明,請參見自訂資料格式及運行頻率。
使用限制
執行個體的網路類型必須為Virtual Private Cloud。
執行個體必須使用公用鏡像或基於公用鏡像建立的自訂鏡像,且作業系統需為以下類型之一:
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最佳化執行個體不支援該功能。更多資訊,請參見已停售的執行個體規格。
建立執行個體時使用自訂資料
1. 準備自訂資料
初始化工具在執行個體初始化過程中,通過讀取使用者提供的自訂資料以完成自訂配置。Linux執行個體和Windows執行個體使用不同的初始化工具。此外,同一初始化工具支援多種自訂資料格式。有關資料格式及其運行頻率的詳細說明,請參見以下內容。
自訂資料格式及運行頻率
Linux執行個體
Linux執行個體使用cloud-init
組件實現執行個體初始化動作。根據執行個體是否初次開機,執行不同的配置內容(一些使用較早版本鏡像的執行個體也採用Upstart Job
進行初始化工作)。
cloud-init
工具支援的自訂資料類型包括可直接配置執行個體的User-Data
和Cloud Config
格式,同時還支援其他使用者資料格式,最常見的為include
檔案和Gzip
壓縮內容。除cloud-init
初始化工具外,一些使用較早版本鏡像的執行個體也採用Upstart Job
進行初始化工作。
自訂資料格式的詳細說明,可參見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檔案寫入系統時間。
自訂執行個體軟體源、DNS解析配置及時間同步服務
在建立執行個體時,您可以通過User-Data指令碼自訂執行個體的軟體源、DNS解析配置及時間同步服務。以下樣本以CentOS Stream 9為例,實際使用中請根據您的作業系統進行相應配置替換。
重要系統會在執行個體啟動時自動設定預設的yum源、NTP服務和DNS服務,您可以使用執行個體自訂資料更改預設的yum源、NTP服務和DNS服務,但請注意:
如果您自訂了yum源,阿里雲官方不再提供yum源相關支援。
如果您自訂了NTP服務,阿里雲官方不再提供相關時間同步服務。
#!/bin/sh # Modify DNS echo "nameserve 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指令碼。
自訂管理員帳號
Linux執行個體預設使用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****。
當User-Data執行遇到問題時,可以通過雲助手公用命令ACS-ECS-UserData-Check-for-linux.sh
來擷取失敗相關的錯誤記錄檔。如果返回有錯誤資訊表示指令碼執行有問題,如果沒有返回錯誤資訊表示執行沒有報錯,需要排查其他方面。關於雲助手公用命令的更多資訊,請參見查看和執行公用命令。
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資料樣本
自訂執行個體軟體源
在自訂資料地區輸入以下內容,以配置自訂執行個體軟體源。樣本中使用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檔案指向一個或多個User-Data指令碼或Cloud Config資料的連結,多個連結按行分隔。執行個體啟動時,cloud-init會逐個解析並讀取連結裡的內容。如果在讀取某一個連結的內容時出錯,則停止讀取剩餘的連結。
說明您可以通過阿里雲Object Storage Service,上傳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壓縮內容的方式,需要使用儲存服務上傳指令碼、擷取指令碼連結、設定連結有效期間等操作,推薦您使用阿里雲Object Storage Service。具體操作,請參見OSS控制台快速入門。
Gzip壓縮內容
簡介
如果您的User-Data指令碼、Cloud Config資料或Include檔案內容的大小超過32 KB,可以採用Gzip壓縮內容(
.gz
格式)並做成連結,然後以Include檔案的形式輸入。cloud-init會自動解壓Gzip壓縮內容,運行解壓後內容的效果和直接傳入後運行沒有區別。說明您可以通過阿里雲Object Storage Service,上傳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外掛程式來運行自訂資料指令碼,該外掛程式僅支援在執行個體初次開機時運行,該外掛程式支援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
。
2. 建立執行個體時使用自訂資料
通過控制台建立執行個體
在執行個體購買頁展開進階選項地區,在自訂資料地區輸入執行個體自訂資料。
重要如果執行個體自訂資料已進行Base64編碼,請勾選輸入已採用Base64編碼,且在進行Base64編碼前自訂資料內容的大小不能超過32 KB。否則,無需勾選,系統會自動對內容進行Base64編碼。
通過API建立執行個體
如果您通過API方式建立執行個體,請在RunInstances - 大量建立ECS執行個體或CreateInstance - 建立ECS執行個體介面指定
UserData
欄位。
3. 驗證自訂資料運行效果
您需要結合自訂指令碼的實際內容進行運行效果的驗證,以下以在Linux執行個體中傳入如下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
命令來查看效果,系統已經向userdata_test.txt
檔案寫入系統時間。
當User-Data執行遇到問題時,可以通過雲助手公用命令ACS-ECS-UserData-Check-for-linux.sh
來擷取失敗相關的錯誤記錄檔。如果返回有錯誤資訊表示指令碼執行有問題,如果沒有返回錯誤資訊表示執行沒有報錯,需要排查其他方面。關於雲助手公用命令的更多資訊,請參見查看和執行公用命令。
其他動作
查看已有執行個體自訂資料
自訂資料傳入執行個體後,您可以通過中繼資料服務或控制台查看執行個體的自訂資料資訊。
通過中繼資料服務擷取(加固模式)
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
在上述樣本中,設定的token有效期間為180秒,實際應用時可根據具體使用情境進行調整。
本樣本使用中繼資料服務的加固模式來擷取中繼資料,關於中繼資料服務擷取資訊的更多內容,請參見通過中繼資料服務從ECS執行個體內部擷取執行個體屬性等資訊。
關於中繼資料的更多說明,請參見執行個體中繼資料。
通過控制台擷取
確保執行個體處於已停止狀態。
重要如果執行個體的計費方式為隨用隨付、網路類型為專用網路,停止執行個體時,停止模式建議選擇普通停機模式,選擇節省停機模式會因計算資源(vCPU和記憶體)被回收,再次啟動執行個體時可能因為庫存不足導致啟動失敗。更多資訊,請參見節省停機模式。
在執行個體頁面,選擇
,然後在使用者資料地區查看已設定的自訂資料。
通過調用API擷取
您可以通過調用DescribeUserData介面查詢一台ECS執行個體的自訂資料。更多資訊,請參見DescribeUserData。
修改已有執行個體自訂資料
如需修改已有執行個體的自訂資料,您可以通過控制台進行操作。
確保執行個體處於已停止狀態。
重要如果執行個體的計費方式為隨用隨付、網路類型為專用網路,停止執行個體時,停止模式建議選擇普通停機模式,選擇節省停機模式會因計算資源(vCPU和記憶體)被回收,再次啟動執行個體時可能因為庫存不足導致啟動失敗。更多資訊,請參見節省停機模式。
在執行個體頁面,選擇
,然後在使用者資料地區輸入自訂資料。
修改已有執行個體的自訂資料之後,在啟動執行個體後自訂資料指令碼是否被執行,取決於自訂資料的格式及運行頻率,請您在修改自訂資料之前明確您的需求,更多資訊,請參見自訂資料格式及運行頻率。
相關文檔
您也可以通過Auto Scaling的自訂資料功能,讓多台ECS執行個體在啟動時自動執行配置的指令碼或命令,確保ECS執行個體配置的一致性,簡化了營運工作。更多資訊,請參見使用執行個體自訂資料自動設定ECS執行個體。
如果希望服務或指令碼因程式異常、伺服器重啟、掉電等被中斷時,及時恢複運行,雲助手外掛程式
ecs-tool-servicekeepalive
實現。具體操作,請參見自動回復服務。如果您希望瞭解更多關於管理執行個體初始化的相關資訊,請參見管理執行個體初始化配置。