如何让 EC2 用户数据脚本在启动时再次运行?

Mik*_*aro 24 amazon-ec2 cloud-init

在第一次启动 EC2 实例时cloud-init 运行用户数据脚本后,可能会写入一个状态文件,以便 cloud-init 在后续重新启动时不会再次运行该脚本。在某些情况下,我想删除此状态文件,以便再次运行用户数据脚本。它在哪里?

Mik*_*aro 32

rm /var/lib/cloud/instances/*/sem/config_scripts_user

确认工作:

  • CentOS 7.4
  • Ubuntu 14.04
  • Ubuntu 16.04

为完整起见,如果您希望跟踪此 AMI [有一个父 AMI,...] 并且它们都运行cloud-init用户数据的事实/可能性,则您只能删除当前信号量。

rm /var/lib/cloud/instance/sem/config_scripts_user

  • @c24w 这些时间戳具有误导性。我实际上花了几个小时的研究和测试,所以一旦我弄清楚了,我就创建了这个问题来帮助下一个人寻找明确的答案。 (10认同)
  • 你很快就想通了。 (2认同)
  • @flag5 元数据服务的“curl”来获取当前实例 ID 是不必要的,因为“/var/lib/cloud/instance”已经是“/var/lib/cloud/instances”下当前实例的符号链接。:-) (2认同)

Har*_*ngh 7

您还可以将用户数据配置为在每次启动时重新运行,而不是删除状态文件。您必须cloud_final_modules在 userdata 脚本中使用来重新运行 userdata 脚本,为此您必须自定义 uderdata 以在 userdata 中包含多个文件。用户数据文件示例如下:

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
/bin/echo "Hello World" >> /tmp/userdata-test.txt
--//
Run Code Online (Sandbox Code Playgroud)

这将使用户数据脚本在每个启动过程的最后一步执行。bin/echo "Hello World" >> /tmp/userdata-test.txt这里只执行一行,将其替换为每次机器启动时需要执行的 shell 脚本。