用户数据脚本未在我的自定义 AMI 上运行,但在标准 Amazon linux 中运行

新手上路,请多包涵

这几天我搜索了很多关于“user-data script is not working”的主题,但是直到现在我还没有得到任何关于我的案例的想法,请帮我弄清楚发生了什么,非常感谢!

根据 AWS User-data 的 解释:

当您在 Amazon EC2 中启动实例时,您可以选择将用户数据传递给实例,这些数据可用于执行常见的自动配置任务,甚至在实例启动后运行脚本。

所以我尝试在实例启动时传递我自己的用户数据,这是我的用户数据:

 \#!/bin/bash

echo 'test' > /home/ec2-user/user-script-output.txt

但是这个路径没有文件: /home/ec2-user/user-script-output.txt

我检查了 /var/lib/cloud/instance/user-data.txt ,该文件存在并且与我的用户数据脚本相同。

我还检查了登录 /var/log/cloud-init.log ,没有错误消息。

但是如果我使用 Amazon linux(2014.09.01) 启动一个新实例,用户数据脚本就可以工作,但我不确定我的 AMI(基于 Amazon linux)和 Amazon linux 之间有什么区别。

我看到的唯一不同的部分是如果我运行这个脚本:

 sudo yum list installed | grep cloud-init

我的 AMI:

cloud-init.noarch 0.7.2-8.33.amzn1 @amzn-main

亚马逊Linux:

已安装 cloud-init.noarch 0.7.2-8.33.amzn1

我不确定这是不是这个原因?

如果您需要更多信息,我很乐意提供,请告诉我在我自己的 AMI 中发生了什么以及如何修复它?

非常感谢

更新

刚刚从这个 帖子 中找到答案,

如果我在用户数据文件的顶部添加#cloud-boothook,它就可以了!

 #cloud-boothook
#!/bin/bash
echo 'test' > /home/ec2-user/user-script-output.txt

但仍然不确定为什么。

原文由 Kai 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 791
2 个回答

User_data 仅在第一次启动时运行。由于您的图像是自定义图像,我想它已经启动过一次,因此 user_data 已停用。

对于 Windows,可以通过选中 Ec2 Services Properties 中的框来完成。我正在研究如何在自定义图像创建结束时以自动方式执行此操作。

对于linux,我想机制是一样的,需要在你的自定义镜像上重新激活user_data。

#cloud-boothook 使其工作,因为它将脚本从 user_data 机制更改为在每次启动时运行的 云引导 程序。


编辑 :

这是使用 powershell 在 Windows 上重新激活启动的代码:

 $configFile = "C:\\Program Files\\Amazon\\Ec2ConfigService\\Settings\\Config.xml"
[xml] $xdoc = get-content $configFile
$xdoc.SelectNodes("//Plugin") |?{ $_.Name -eq "Ec2HandleUserData"} |%{ $_.State = "Enabled" }
$xdoc.SelectNodes("//Plugin") |?{ $_.Name -eq "Ec2SetComputerName"} |%{ $_.State = "Enabled" }
$xdoc.OuterXml | Out-File -Encoding UTF8 $configFile

$configFile = "C:\\Program Files\\Amazon\\Ec2ConfigService\\Settings\\BundleConfig.xml"
[xml] $xdoc = get-content $configFile
$xdoc.SelectNodes("//Property") |?{ $_.Name -eq "AutoSysprep"} |%{ $_.Value = "Yes" }
$xdoc.OuterXml | Out-File -Encoding UTF8 $configFile

(我知道问题集中在linux,但它可以帮助其他人……)

原文由 Thibault Deheurles 发布,翻译遵循 CC BY-SA 3.0 许可协议

正如我测试的那样,在 /var/lib/cloud 目录中有一些引导数据。清除该目录后, 用户数据 脚本正常工作。

 rm -rf /var/lib/cloud/*

原文由 jkim 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题