本文介绍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实例)。