通过 cloud-init 运行脚本

tcu*_*rdt 4 server-setup cloud-init terraform

我知道cloud-init允许将命令作为cloud-init yml的一部分运行

runcmd:
 - [ pwd ]
Run Code Online (Sandbox Code Playgroud)

但我正在寻找一种执行完整 shell 脚本的方法。

有些人只是将 a 的输出通过管道传输curl到 shell 中 - 但这感觉像是一种非常不稳定的方法。也许脚本可以通过一些模板集成到 yml 中,但这听起来也不太好。

更好的方法是将脚本与 yml 一起发送给主机并引用它。但我还没有找到任何有关如何执行此操作的文档。

这可能吗?

我正在使用terraform来设置服务器,但我想知道这是否也可以使用纯cloud-init来完成。

小智 5

如果您只想运行脚本,可以直接将脚本作为用户数据传递,而不是使用云配置。只要脚本以 开头#!,cloud-init 就会尝试直接运行它,而不是将其解释为云配置。

如果您想同时运行 cloud-config 和单独的脚本,而其他发布的write_files解决方案也可以工作,您还可以传递 mime 多部分存档。Cloud-init 包含一个帮助程序脚本,使此过程变得更容易。假设您的文件中有用户数据my-user-data

#cloud-config
runcmd:
  - echo 'test-from-cloud-config' > /var/tmp/test_from_cloud_config
Run Code Online (Sandbox Code Playgroud)

以及您想要运行的脚本 callecd test.sh

#!/bin/bash

echo 'test_from_script' > /var/tmp/test_from_script
Run Code Online (Sandbox Code Playgroud)

您可以致电:

cloud-init devel make-mime -a test.sh:x-shellscript -a my-user-data:cloud-config > /tmp/userdata
Run Code Online (Sandbox Code Playgroud)

您可以获取生成的多部分文件并将其作为用户数据传递给cloud-init(例如使用LXD):

lxc launch ubuntu:focal multi -c user.user-data="$(cat /tmp/userdata)"
Run Code Online (Sandbox Code Playgroud)

您可以看到 cloud-config 和脚本都已运行:

root@multi:~# cat /var/tmp/test_from_cloud_config 
test-from-cloud-config
root@multi:~# cat /var/tmp/test_from_script 
test_from_script
Run Code Online (Sandbox Code Playgroud)

请参阅cloud-init 文档以供参考。

  • 由于这个问题被标记为“terraform”,我还想指出[属于 `hashicorp/cloudinit` Terraform 提供程序的 `cloudinit_config` 数据源](https://registry.terraform.io/providers/hashicorp/cloudinit/latest /docs/data-sources/cloudinit_config)实际上是 Terraform 集成的“cloud-init devel make-mime”的等效项,如果您碰巧使用 Terraform 进行设置,则可以避免创建单独的临时文件的步骤。 (3认同)