Cloud-init 每次启动脚本不执行任何操作

Jor*_*elf 7 ubuntu amazon-ec2 amazon-web-services cloud-init

我是 cloud-init 的新手,我的最终目标是每次 EC2 Spot 实例变为活动状态时运行 R 脚本,但为了测试它,我创建了一个按需 Ubuntu 12.04 实例并创建了一个简单的脚本,但之后没有任何反应重启。以下是我采取的步骤:

  • 推出新的 Ubunut 12.04 实例
  • 导航/var/lib/cloud/scripts/per-boot
  • sudo vi script.sh
  • 添加了以下代码:

#!/bin/sh
回显“测试”

  • sudo reboot

此时,我认为当实例重新启动时我应该看到“测试”打印,但那里什么也没有。我去看了一下/var/log/cloud-init.log,没有发现任何错误或异常。

我显然错过了一些东西,所以任何正确方向的提示将不胜感激!

谢谢!

小智 9

查看源代码,脚本应该是可执行的。这会让它发挥作用

sudo chmod 744 script.sh


fur*_*ive 7

在我看来,接受的答案是不够的,所以在我花了整个上午的时间来探究这个问题的根源之后,我将写下我的观点,因为我相信人们会发现这很有用并节省时间。

如果scripts-user模块设置为始终运行,则runcmd:cloudinit 的部分将在每次启动时运行。

这可以通过在您的云配置文件中添加以下部分来完成:

cloud_final_modules:
 - [scripts-user, always]
Run Code Online (Sandbox Code Playgroud)

如果您想在每次启动时运行某些脚本,那么您需要将其放在

/var/lib/cloud/scripts/per-boot/文件夹。为此,请将以下部分添加到您的云配置文件中,

write_files:
  - content: |
      #!/bin/bash
      echo "Hello World.  The time is now $(date -R)!"
    path: /var/lib/cloud/scripts/per-boot/myScript.sh
    permissions: "0755"
Run Code Online (Sandbox Code Playgroud)

现在每次我重新启动 EC2 实例时它都会运行myScript.sh

cloud-config在 Rhel 8 上安装 amazon ssm 代理的完整示例

#cloud-config
cloud_final_modules:
 - rightscale_userdata
 - scripts-per-once
 - scripts-per-boot
 - scripts-per-instance
 - scripts-user
 - keys-to-console
 - phone-home
 - final-message

write_files:
  - content: |
      #!/bin/bash
      echo "Hello World.  The time is now $(date -R)!"
    path: /var/lib/cloud/scripts/per-boot/myScript.sh
    permissions: "0755"


runcmd:
  - sudo dnf install -y python3
  - sudo yum install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm
  - sudo systemctl enable amazon-ssm-agent
  - sudo systemctl start amazon-ssm-agent

Run Code Online (Sandbox Code Playgroud)

请注意,在这种情况下,在第一次启动myScript.sh之前执行runcmd:,后续启动仅执行myScript.sh


小智 5

如果我们想调试cloud-init中的用户数据,我们可以尝试以下步骤:

  1. rm -rf /var/lib/cloud/*
  2. 云初始化
  3. cloud-init 模块 -m Final

使用上述命令,cloud-init 重新运行。我们可以查看/var/log/cloud-init.log下的cloud-init.log来检查是否成功执行。

  • 执行此操作后,我在重复运行模块时收到错误 `IsADirectoryError: [Errno 21] Is a directory: '/var/lib/cloud/instance'` 。我不想丢失/重新创建我的 `/var/lib/cloud/scripts/per-boot` 脚本,所以我进行了实验,发现 `sudo rm -rf /var/lib/cloud/instance /var/lib/cloud /实例/*;sudo cloud-init module -m Final` 是允许我重新测试所需的最小清理。感谢您的领导! (2认同)

Chr*_*her 2

除非脚本用户设置为始终运行,否则它不会运行。有关更多详细信息,请参阅此答案(以及有关如何让脚本在重新启动时运行的说明)。

  • 它是否正确?这个问题是关于“/var/lib/cloud/scripts/per-boot/*”,您链接到的问题是关于让“/var/lib/cloud/instance/user-data.txt”在每次启动时运行。答案中的最后一个陈述建议使用前者代替后者。 (6认同)