首页 文章

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

提问于
浏览
1

我正在使用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的一个非常流行的用例 .


EDIT

经过一些日志记录后,我发现在执行用户数据期间不仅没有Ansible,而且数据库也丢失了 .

是否有可能在启动实例时执行Packer中Ansible配置器中的某些代码(或全部代码)?


EDIT2

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

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

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

2 回答

  • 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"]
      },
     ]
    }
    
  • 0

    这个有可能!请确认以下内容 .

    • Ansible服务器(如果未构建到AMI中,则通过 Cloud 形成userdata安装ansible),并且您的目标在您在cloudformation中创建的安全组中具有SSH访问权限 .

    • 在ansible服务器上安装ansible之后,你的ansible.cfg文件指向ansible服务器上的私钥

    • ansible私钥的匹配公钥被复制到root用户.ssh目录中的服务器上的authorized_keys文件中,您希望在其上运行playbooks - 您已在ansible服务器和目标服务器之间启用了root ssh访问,这可以通过编辑/ etc / ssh / sshd_config文件并确保在目标服务器上的root authorized_keys文件中没有阻止root用户的SSH访问来完成

相关问题