我正在使用 Packer 和 Ansible 创建 AWS EC2 映像 (AMI)。Ansible 用于安装 Java 8,安装数据库(Cassandra),安装 Ansible 并上传 Ansible playbook(我知道我应该将 playbook 推送到 git 并拉取它,但当它工作时我会这样做)。我正在安装 Ansible 并上传剧本,因为当从 AMI 启动实例时,我必须更改一些 Cassandra 属性(例如,在 Cassandra 选项中添加当前实例 IP)。为了实现这一点,我编写了一个简单的 bash 脚本,将其添加为user-data-file
属性。这是脚本:
#cloud-boothook
#!/bin/bash
#cloud-config
output: {all: '| tee -a /var/log/cloud-init-output.log'}
ansible-playbook -i "localhost," -c local /usr/local/etc/replace_cassandra.yaml
如您所见,我正在 localhost 模式下执行 ansible-playbook。
问题是当我启动实例时,我在/var/log/cloud-init.log
文件中发现了一个错误。错误状态,ansible-playbook
无法找到。所以我ls
在用户数据脚本中添加了一行来检查/usr/bin/
文件夹的内容(安装 Ansible 的文件夹)并且其中没有 Ansible,但是当我使用 ssh 访问实例时,我可以看到里面存在 Ansible文件夹,/usr/bin/
执行 ansible-playbook 没有问题。
有没有人遇到过类似的问题?我认为这应该是 Ansible 与 EC2 的一个非常流行的用例。
编辑
经过一些日志记录后,我发现在执行用户数据的过程中不仅没有 Ansible,而且数据库也丢失了。
Packer 的 Ansible 配置器中的部分代码(或全部)是否有可能在实例启动时执行?
编辑2
我发现这里发生了什么。当我通过加壳器通过user_data_file
属性添加用户数据时,用户数据在加壳器午餐实例以构建 AMI 时执行。该脚本在执行 Ansible 配置程序之前启动,这就是缺少 Ansible 的原因。
我想要做的是自动将用户数据添加到 AMI,这样当从 AMI 启动实例时,将执行用户数据,而不是在打包程序构建所述 AMI 时执行。
关于如何做到这一点的任何想法?