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


19

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

Answers:


24

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


2
您很快就知道了。
c24w

9
@ c24w这些时间戳具有误导性。实际上,这花了我几个小时的研究和测试,因此,一旦我弄清楚了,我就创建了这个问题,以帮助下一个寻找最终答案的人。
Mike

1
从那以后我就遇到了这个问题,但没有意识到鼓励它发布Wiki类型的问答。感谢您对此进行记录!
c24w

1
我很高兴在serverfault上受到鼓励。我在SO上看过很多次
坦率地说,

1
@ flag5不需要curl向元数据服务获取当前实例ID,因为/var/lib/cloud/instance已经是指向当前实例的符号链接/var/lib/cloud/instances。:-)
Mike

2

您可以将脚本放在/etc/rc.local中,该脚本将在每次重新启动时运行。


/etc/rc.local与EC2用户数据无关。
麦克

@MikeConigliaro我想使用用户数据来使每次启动时都运行某些内容,因此我将用户数据脚本附加到了/etc/rc.local。
user253751 '10

0

您还可以将用户数据配置为在每次引导时重新运行,而不是删除状态文件。您必须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
--//

这将使userdata脚本在每个引导过程的最后一步执行。在这里,只有一行bin/echo "Hello World" >> /tmp/userdata-test.txt要执行,请将其替换为每次引导计算机时都需要执行的shell脚本。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.