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实例设置自定义数据并重启实例后发现自定义数据未生效,查看系统日志提示错误信息:"Failed to run module scripts-user(scripts in /var/lib/cloud/instance/scripts)",表示Linux实例启动时cloud-init中的user-data执行失败。

image.png

关于如何查看系统日志的具体操作,请参见查看实例的系统日志和屏幕截图

问题原因

该问题很可能是由于实例内部的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实例)