在EC2实例上使用用户数据脚本运行ansible-playbook

时间:2016-06-13 18:05:33

标签: linux amazon-ec2 ansible packer cloud-init

我正在使用Packer和Ansible来创建AWS EC2映像(AMI)。 Ansible用于安装Java 8,安装数据库(Cassandra),安装Ansible并上传一个Ansible playbook(我知道我应该将playbook推到git并拉动它但我会在这个工作时这样做)。我正在安装Ansible并上传playbook,因为我必须在从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配置器中的某些代码(或全部代码)?

EDIT2

我已经发现这里发生了什么。当我通过包装器通过user_data_file属性添加用户数据时,当packer午餐一个实例来构建AMI时,将执行用户数据。该脚本在Ansible供应商执行之前启动,这就是Ansible缺失的原因。

我想要做的是自动将用户数据添加到AMI,这样当从AMI启动实例时,将执行用户数据,而不是当打包器构建所述AMI时。

关于如何做到这一点的任何想法?

2 个答案:

答案 0 :(得分:1)

只需运行多个配置程序,不要尝试通过cloud-init运行ansible。

我在这里假设你的剧本和角色存储在你开始打包的地方。不要将ansible的内容整理成用户数据,而是运行shell配置程序来安装ansbile,运行ansible-local配置程序来运行你想要的playbook / role。

以下是我所谈论的简化示例。在构建器配置中没有更多值的情况下它不会运行,但为了简洁起见我将它们遗漏了。

在示例json中,install-prereqs.sh只添加了ansible ppa apt repo并运行apt-get update -y,然后安装ansible。

#!/bin/bash

sudo apt-get install software-properties-common
sudo apt-add-repository -y ppa:ansible/ansible
sudo apt-get update
sudo apt-get install -y ansible

然后,第二个配置程序会将您指定的playbook和角色复制到目标主机并运行它们。

{
"builders": [
  {
    "type": "amazon-ebs",
    "ssh_username": "ubuntu",
    "image_name": "some-name",
    "source_image": "some-ami-id",
    "ssh_pty": true
  }
],
"provisioners": [
  {
    "type": "shell",
    "script": "scripts/install-prereqs.sh"
  },
  {
    "type": "ansible-local",
    "playbook_file": "path/to/playbook.yml",
    "role_paths": ["path/to/roles"]
  },
 ]
}

答案 1 :(得分:0)

这是可能的!请确保以下内容。

  • Ansible服务器(如果没有内置到AMI中,则通过云形成用户数据安装ansible),并且您的目标在您在cloudformation中创建的安全组中具有SSH访问权限。
  • 在ansible服务器上安装ansible后,您的ansible.cfg文件指向ansible服务器上的私钥
  • 将ansible私钥的匹配公钥复制到您希望在其上运行playbooks的root用户.ssh目录中的服务器上的authorized_keys文件中 - 您已在ansible服务器和目标服务器之间启用了root ssh访问,这可以通过编辑/ etc / ssh / sshd_config文件并确保没有任何东西阻止root用户访问root用户来完成目标服务器上的authorized_keys文件