本文介紹Linux執行個體的自訂資料未生效,系統日誌提示"Failed to run module scripts-user(scripts in /var/lib/cloud/instance/scripts)"錯誤時的問題原因及解決方案。
問題現象
Linux執行個體設定自訂資料並重啟執行個體後發現自訂資料未生效,查看系統日誌提示錯誤資訊:"Failed to run module scripts-user(scripts in /var/lib/cloud/instance/scripts)",表示Linux執行個體啟動時cloud-init中的user-data執行失敗。

關於如何查看系統日誌的具體操作,請參見查看執行個體的系統日誌和螢幕截圖。
問題原因
該問題很可能是由於執行個體內部的User-Data指令碼內容出現錯誤,包括但不限於指令碼內容文法格式不正確或指令碼本身執行失敗等。
解決方案
您可以通過多種指令碼準備Linux執行個體的自訂資料,不同指令碼類型的特點以及規範存在差異。請您根據實際情況,參考對應指令碼類型的自訂資料規範,對指令碼的內容逐步進行排查。
User-Data指令碼
User-Data指令碼傳入Linux執行個體後直接作為Shell指令碼執行。User-Data指令碼具有以下特點:
首行以
#!開頭。僅在執行個體初次開機時運行一次。
樣本User-Data指令碼:
#!/bin/sh
echo "Hello World. The time is now $(date -R)!" | tee /root/userdata_test.txt樣本User-Data指令碼的效果為在執行個體初次開機時向userdata_test.txt寫入系統時間。
當User-Data指令碼執行遇到問題時,可以通過雲助手公用命令ACS-ECS-UserData-Check-for-linux.sh來擷取失敗相關的錯誤記錄檔。如果返回有錯誤資訊表示指令碼執行有問題,如果沒有返回錯誤資訊表示執行沒有報錯,需要排查其他方面。關於雲助手公用命令的更多資訊,請參見查看和執行公用命令。
Cloud Config資料
Cloud Config是通過使用者資料完成某些任務的最簡單方法。當您使用cloud-init執行某些任務時,推薦使用Cloud Config的配置方式。
以Cloud Config資料的形式編寫內容可以方便地為執行個體預先配置一些服務,例如更新yum源、匯入SSH密鑰、安裝依賴包等。Cloud Config資料具有以下特點:
首行為
#cloud-config,且起始位置不能有空格。必須遵循YAML文法編寫內容。
執行個體自訂資料的運行頻率由您配置的模組決定。例如,Apt配置每台執行個體僅運行一次,Bootcmd則執行個體每次啟動時都會運行一次。
樣本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檔案包含一個或多個指令碼連結,指令碼連結按行分隔。執行個體啟動時,cloud-init會逐個讀取指令碼連結以及指令碼的內容。如果在讀取某一個指令碼的內容時出錯,則停止讀取剩餘的指令碼。Include檔案具有以下特點:
首行為
#include,且起始位置不能有空格。每個指令碼內容的大小在Base64編碼前不能超過16 KB。
執行個體自訂資料的運行頻率由指令碼類型和模組類型決定。
樣本Include檔案:
#include
https://ecs-image-test.oss-cn-hangzhou.aliyuncs.com/userdata/myscript.sh樣本Include檔案包含一個指令碼連結,運行頻率由指令碼的類型決定。例如該指令碼為User-Data指令碼,則僅在執行個體初次開機時運行一次。
Gzip壓縮內容
如果您的User-Data指令碼、Cloud Config資料和Include檔案內容的大小可能超過16 KB,可以採用Gzip壓縮內容(.gz格式)並做成連結,然後以Include檔案的形式輸入。cloud-init會自動解壓Gzip壓縮內容,運行解壓後內容的效果和直接傳入後運行沒有區別。Gzip壓縮內容具有以下特點:
首行為
#include,且起始位置不能有空格。每個壓縮內容的大小在Base64編碼前不能超過16 KB。
執行個體自訂資料的運行頻率由指令碼類型和模組類型決定。
樣本Gzip壓縮內容:
#include
https://ecs-image-test.oss-cn-hangzhou.aliyuncs.com/userdata/myscript.gz樣本Include檔案包含一個Gzip壓縮內容連結,cloud-init讀取該Gzip壓縮內容後會自動解壓並運行,運行頻率由指令碼的類型決定。例如該Gzip壓縮內容由User-Data指令碼壓縮得到,則僅在執行個體初次開機時運行一次。
Upstart Job
Upstart Job將內容存放到/etc/init目錄下的檔案中。Upstart Job具有以下特點:
首行為
#upstart-job,且起始位置不能有空格。執行個體每次啟動時都會運行。
如需使用Upstart Job,您需要為執行個體安裝upstart服務,支援採用upstart服務管理啟動行為的作業系統有CentOS 6、Ubuntu 10/12/14以及Debian 6/7。
樣本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關於更多自訂資料樣本,請參見使用執行個體自訂資料(Linux執行個體)。