我读到您只能在 EC2 AMI 上运行一次用户数据。如果您从 EC2 实例创建自定义 AMI,则无法在该自定义 AMI 上运行 userdata 脚本。在 Ubuntu 实例上,您可以删除 /var/lib/cloud/* ,创建自定义 AMI 并在自定义 AMI 上运行 userdata。我在 FreeBSD 上找不到 /var/lib/cloud/* 的等价物。
有没有办法在自定义 FreeBSD AMI 上运行 userdata 或创建 AMI 的替代方法,以便您可以再次运行 userdata 脚本?
Linux 有 #cloud-boothook,但对于 FreeBSD,我只发现 configinit 不能满足我的需要。我们在启动实例时从命令行将参数传递到 userdata 脚本。
AWS 上的 FreeBSD AMI 对 user_data 脚本的支持与其他 AMI 不同。正如您所指出的,它不支持
#cloud-boothook
user_data 并忽略启动后传递的任何 user_data 。一个简单的解决方案如下:
这是一个技巧——您的实例现在将执行所有 user_data 脚本,即使是那些没有
#cloud-boothook
标签的脚本,但在我看来,它比脚本的默认行为要好得多。请注意,始终可以ec2_configinit
通过在/etc/rc.conf
.我提供我自己的答案,因为接受的答案非常粗略。
更新:我认为接受的答案非常粗略,但最后,我还是在使用它,因为它最适合我。这里的其余部分只会提供一些其他人可能会觉得有用的背景。接受的答案最终对我最有效,因为:(1)它允许我始终执行 shell 脚本,(2)除了按照我在下面解释的方式处理用户数据文件之外,它不做任何其他事情,( 3) 如果我愿意,我仍然可以在 rc.conf 中禁用它。
问题是,即使在 Amazon Linux 上,用户数据脚本也只会在首次启动时执行,除非您使用 MIME 多部分/混合技巧。您可以查看它https://cloudinit.readthedocs.io/en/latest/topics/format.html但我给出了一个推动限制的示例:
我发现这两个脚本是按字母顺序执行的,而图像部分被忽略了。
除非 FreeBSD AMI 维护者实现这个多部分的东西和它所涉及的所有东西
为什么你想要 ec2-cloudinit 总是这样执行的所有其他事情?最终你是你自己的。
自己获取用户数据并决定如何处理确实没有害处。以下是获取它的方法:
所以,如果你想执行它,你可以把它放到 rc.local 中:
或者
真的没什么大不了的。不确定是否值得支持复杂的多部分结构。FreeBSD AMI 做得非常不同,而且更简单,而且可以说很好。
由于它不是 AWS 标准,所以我不会理会它。只需有一个脚本并强制它在 rc.local 中执行,或者甚至不执行,只是检查以找到一些以某种方式控制行为的参数。