![向 AMI 添加自定义 CloudInit 部分处理程序](https://linux22.com/image/605531/%E5%90%91%20AMI%20%E6%B7%BB%E5%8A%A0%E8%87%AA%E5%AE%9A%E4%B9%89%20CloudInit%20%E9%83%A8%E5%88%86%E5%A4%84%E7%90%86%E7%A8%8B%E5%BA%8F.png)
是否可以将自定义 CloudInit 部分处理程序直接添加到 AMI,以便所有新实例都可以使用它,而不必每次都将其添加到用户数据中?
我有几个自定义 MIME 类型,我们用它们来定义 EC2 云实例的配置数据和处理它们所需的 #part-handler python 脚本。我希望通过消除每次创建新实例时将这些部件处理程序包含在用户数据中的需要来简化实例创建过程。CloudInit 脚本中是否有一些钩子,我可以将我的部件处理程序直接添加到 AMI,这样我唯一需要通过用户数据传递的就是配置文件本身?
答案1
似乎没有插件机制,但你能做的是将配置托管在 HTTP 服务器上,然后包括它启动实例时,而不是重复执行:
以“#include”或“Content-Type: text/x-include-url”开头
此内容为“include”文件。该文件包含一个 URL 列表,每行一个。每个 URL 都将被读取,其内容将通过同一组规则。即,从 URL 读取的内容可以是 gzip 压缩、mime-multi-part 或纯文本
答案2
刚刚花了几个小时在这件事上,发现你实际上可以将部分处理程序保存在 /var/lib/cloud/handlers 下,但有一些注意事项。
我不确定文件名是否应该有特定的模式,但就我而言,我将其保存为 /var/lib/cloud/handlers/part-handler-000.py 并用它创建了一个 AMI。
当基于该 AMI 启动新实例时,似乎必须在多部分 MIME 中提供该 MIME 的用户数据(是的,即使该多部分仅包含您自己的部分)。
我确实尝试将以下内容作为第一行发送
Content-Type: text/XXXXX;
或者
#XXXXX
但都不起作用