用户数据脚本没有在我的自定义AMI上运行,而是在标准的Amazon linux中运行

Kai*_*Kai 47 linux amazon-ec2 amazon-web-services user-data

这几天我搜索了很多关于"用户数据脚本不能正常工作"的话题,但直到现在,我还没有对我的案例有任何了解,请帮我弄清楚发生了什么,非常感谢!

根据AWS 用户数据说明:

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

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

\#!/bin/bash

echo 'test' > /home/ec2-user/user-script-output.txt
Run Code Online (Sandbox Code Playgroud)

但是这条路径中没有文件: /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
Run Code Online (Sandbox Code Playgroud)

我的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
Run Code Online (Sandbox Code Playgroud)

但仍不确定原因.

Thi*_*les 24

User_data仅在首次启动时运行.由于您的图像是自定义图像,我认为它已经启动一次,因此user_data被停用.

对于Windows,可以通过选中Ec2服务属性中的框来完成.我正在考虑如何在自定义图像创建结束时以自动方式执行此操作.

对于linux,我认为机制是相同的,并且需要在自定义映像上重新激活user_data.

#cloud-boothook让它工作,因为它从一个改变脚本user_data机制到云boothook上每次启动运行一个.


编辑:

以下是使用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
Run Code Online (Sandbox Code Playgroud)

(我知道关注linux的问题,但它可以帮助其他人...)


小智 7

我在 Ubuntu 16.04 hvm AMI 上也遇到了同样的问题。我已将此问题提交给 AWS 支持,但仍然找不到影响它的确切原因/错误。

但我仍然有一些可以帮助你的东西。

在使用 AMI 之前删除 /var/lib/cloud 目录(每次)。然后在创建 Image 时,将其设置为 no-reboot。

如果这些东西仍然不起作用,您可以通过强制用户数据手动运行来进一步测试它。也是/var/log/cloud-init-output.log云初始化状态的tailf 。它应该以 modules:final 之类的内容结束,以使您的用户数据运行。它不应该停留在 modules:config 上。

sudo rm -rf /var/lib/cloud/* sudo cloud-init init sudo cloud-init modules -m final

我不太清楚上述命令是否适用于 CentOS。我已经在 Ubuntu 上测试过了。

就我而言,我也尝试删除 /var/lib/cloud 目录,但在我们的场景中仍然无法执行用户数据。但我想出了不同的解决方案。我们所做的是使用上述命令创建脚本,并使该脚本在系统启动时运行。

我在 /etc/rc.local 中添加了以下行来实现它。

sudo bash /home/ubuntu/force-user-data.sh || exit 1

但这里有一个问题,它会在每次启动时执行脚本,这样你的用户数据就可以在每次启动时运行,就像 #cloud-boothook 一样。不用担心,您可以通过在最后删除 force-user-data.sh 本身来调整它。所以你的 force-user-data.sh 看起来像

#!/bin/bash sudo rm -rf /var/lib/cloud/* sudo cloud-init init sudo cloud-init modules -m final sudo rm -f /home/ubuntu/force-user-data.sh exit 0

如果有人可以说明为什么它无法执行用户数据,我将不胜感激。


jor*_*fus 7

我在这方面遇到了很多麻烦。我将提供详细的演练。

我的额外问题是我使用 terraform 通过启动配置和自动缩放组来实例化主机。

我无法通过在 lc.tf 中添加内联脚本来使其工作

user_data                   = DATA <<
"
#cloud-boothook
#!/bin/bash
echo 'some crap'\'
"
DATA
Run Code Online (Sandbox Code Playgroud)

我可以从用户数据中获取它,

wget http://169.254.169.254/latest/user-data
Run Code Online (Sandbox Code Playgroud)

但注意到我得到的引号仍然在里面。

这就是我让它工作的方式:我转而从模板中提取它,因为所见即所得。

user_data                   = "${data.template_file.bootscript.rendered}"
Run Code Online (Sandbox Code Playgroud)

这意味着我还需要像这样声明我的模板文件:

data "template_file" "bootscript" {
  template = "${file("bootscript.tpl")}"

}
Run Code Online (Sandbox Code Playgroud)

但我仍然在云初始化日志 /var/log/cloud-init.log [警告] 中收到错误:未处理的非多部分(文本/x-非多部分)用户数据:'内容类型:文本/云。 ..'

然后我发现这篇关于用户数据格式化 user 的文章这是有道理的,如果用户数据可以分为多个部分,也许 cloud-init 需要在一个地方使用 cloud-init 命令,在另一个地方使用脚本。

所以我的 bootscript.tpl 看起来像这样:

Content-Type: multipart/mixed; boundary="//"
MIME-Version: 1.0

--//
Content-Type: text/cloud-config; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="cloud-config.txt"

#cloud-config
cloud_final_modules:
- [scripts-user, always]

--//
Content-Type: text/x-shellscript; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="userdata.txt"

#!/bin/bash
echo "some crap"
--//
Run Code Online (Sandbox Code Playgroud)


小智 6

这是一个例子的答案:确保你只在标题中 #!/bin/bash

#!/bin/bash
yum update -y
yum install httpd mod_ssl
service httpd start
chkconfig httpd on
Run Code Online (Sandbox Code Playgroud)


小智 5

如我所测试,/var/lib/cloud目录中有一些引导数据。清除该目录后,“ 用户数据”脚本正常运行。

rm -rf /var/lib/cloud/*
Run Code Online (Sandbox Code Playgroud)