如何多次运行云初始化模块,例如 runcmd、write_files、runcmd

如何多次运行云初始化模块,例如 runcmd、write_files、runcmd

我正在使用 cloud-init 在 Azure 上构建 Ubuntu 16.04 LTS VM。我想要构建的服务器将运行从自定义存储库安装的软件。

我使用runcmd指令来添加存储库,更新 apt 数据库并安装包及其依赖项:

runcmd:
  - wget -O - https://nightly.odoo.com/odoo.key | apt-key add -
  - echo "deb http://nightly.odoo.com/10.0/nightly/deb/ ./" | tee /etc/apt/sources.list.d/odoo.list
  - apt update
  - apt install --assume-yes odoo

然后我使用该指令编写自定义配置文件write_files。我无法在安装软件之前执行此操作,因为配置文件的存在会在安装过程中触发交互式提示。

然后我想做的是执行进一步的命令(具体来说,我想运行 certbot 来安装 Lets Encrypt 证书)。我一直找不到这样做的方法。

可以添加第二组条目runcmd,但默认情况下,cloud-init 将忽略除最后一组之外的所有条目。

解决方案用于将多组条目合并在一起。但是,这些命令随后会一起执行,这不是我想要的。

一个明显的解决方案是使用 shell 命令而不是使用指令来编写配置文件write_files,但我真的觉得我的整个方法都在逆流而上,而​​且对于这个相当普遍的要求,也许有一个更直接的解决方案。

任何意见均表示感谢。

答案1

这并不能解决在 cloud-init 执行期间的不同点运行 shell 命令的具体问题,但是解决我的问题的方法是使用内置功能来添加 apt 源:

https://cloudinit.readthedocs.io/en/latest/topics/examples.html#additional-apt-configuration

我想更普遍的答案是使用模块来做所有你能做的事情,在必要时使用 runcmd,如果两者都需要,那就编写自己的云初始化模块。

相关内容