gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:45:23 24 4
gpt4 key购买 nike

我将 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 with EC2 的一个非常流行的用例。


编辑

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

是否有可能在实例启动时执行 Packer 中 Ansible 供应器中的部分(或全部)代码?


EDIT2

我已经知道这里发生了什么。当我通过加壳器通过 user_data_file 属性添加用户数据时,当加壳器使用一个实例来构建 AMI 时执行用户数据。该脚本在执行 Ansible 供应器之前启动,这就是缺少 Ansible 的原因。

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

关于如何做到这一点有什么想法吗?

最佳答案

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

我在这里假设您的剧本和角色存储在您开始运行打包程序的本地位置。不要将 ansible 的东西塞进用户数据中,而是运行 shell provisioner 来安装 ansbile,运行 ansible-local provisioner 来运行你想要的剧本/角色。

下面是我所说内容的一个简化示例。它不会在构建器配置中没有更多值的情况下运行,但为了简洁起见,我将它们省略了。

在示例 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

然后,第二个供应商会将您指定的剧本和角色复制到目标主机并运行它们。

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

关于linux - 在 EC2 实例上使用用户数据脚本运行 ansible-playbook,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37796402/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com