【发布时间】:2016-10-14 06:20:58
【问题描述】:
我正在使用 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
如您所见,我正在本地模式下执行 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 配置程序中的部分代码(或全部代码)?
EDIT2
我发现这里发生了什么。当我通过加壳程序通过user_data_file 属性添加用户数据时,用户数据在加壳程序午餐实例以构建 AMI 时执行。该脚本在执行 Ansible 配置程序之前启动,这就是缺少 Ansible 的原因。
我想要做的是自动将用户数据添加到 AMI,这样当从 AMI 启动实例时,将执行用户数据,而不是在打包程序构建所述 AMI 时执行。
关于如何做到这一点的任何想法?
【问题讨论】:
-
您的#cloud-config 格式似乎有误。尝试将 ansible-playbook 命令放入
bootcmd:像这样 doc -
我认为这不是问题所在。正如我在问题中所说,
/usr/bin文件夹中没有ansible-playbook,这就是代码不起作用的原因。 -
这里有类似的问题,只是没有打包器: pip install ansible; ansible-playbook ... 失败,命令 not foud for ansible-playbook
-
很高兴知道我不是唯一一个遇到同样问题的人。
-
@JukkaDahlbom 你可以检查
pip install ansible是否真的安装了ansible。我正在使用 apt,它需要添加 ansible repo,然后才能安装。
标签: linux amazon-ec2 ansible packer cloud-init