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
如果有人可以说明为什么它无法执行用户数据,我将不胜感激。
我在这方面遇到了很多麻烦。我将提供详细的演练。
我的额外问题是我使用 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)
| 归档时间: |
|
| 查看次数: |
35874 次 |
| 最近记录: |