- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我将 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/
我有一个包含 3 个剧本的 ansible 剧本 YAML 文件。 第一个播放和第三个播放在本地主机上运行,但第二个播放在远程计算机上运行,如下例所示: - name: Play1 hos
我有一本蓝绿色的部署手册。它依赖于某些变量来确定应用底层角色的主机。以下是示例角色之一: - name: Remove current server from load balancer host
关闭。这个问题是off-topic .它目前不接受答案。 想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。 9年前关闭。 Improve this q
我正在尝试使用 USB 电缆和终端线路命令 blackberry-deploy -installApp... 我收到一个错误,指的是应用程序和调试 token 之间的作者不匹配 result::fai
我正在尝试使用 ansible-pull 方法在 playbook 的运行时运行带有额外变量的 playbook。 这是我需要如何使用 vars 运行我的剧本。 ansible-playbook de
我在我看不到的远程机器(客户端)上使用 ansible-pull 运行一个 ansible 脚本。 我想确保: ansible playbook 执行成功然后应该发送摘要 ansible playbo
在我的剧本中,我有一个条件包含语句来包含一个任务: tasks: # Install Java if not present - name: Execute Java shel
我一直在尝试按照 BlackBerry 文档在命令行上签署 WebWorks SDK 应用程序并上传到 App World。 这是一个chart showing the high level pict
我们使用 ansible-playbook 来创建/更新 cloudformation 堆栈。如果我们使用 create_changeset=yes 运行 playbook,那么 ansible 会创
有没有人提出使用 eclipse 插件和命令行脚本在运行 Playbook OS 2.0 的 Blackberry Playbook 上快速调试和运行 android 应用程序的策略? 最佳答案 当然
我正在使用以下剧本来检查从目标主机 192.168.153.31 到 8.8.8.8 的连接 --- - hosts: 192.168.153.31 gather_facts: no task
我是 ansible 的新手。我想用 ansible 简化我的网络任务。我想做的一件事是登录到所有网络 (Cisco) 交换机并显示带有包含某个字符串的描述的接口(interface)。我打算使用 c
如果系统安装了 Oracle Linux,我如何检查已安装的操作系统并继续下载文件。 这就是我要做的 - hosts: all become: true gather_facts: true
我不明白或看到我做错了什么,但似乎我无法让我的 ansible playbook 在 ubuntu 服务器上启动 rng-tools 服务。 environment: remote serve
我想一个接一个地在 4 个服务器上运行一些 ansible 任务,即以串行方式。但中间会有停顿。所以,我最后在剧本中添加了暂停,但我希望在最后一个服务器上跳过它。否则它会无缘无故地等待。请让我知道如何
我正在尝试运行 ansible-plabook,但它在设置时挂起。我的剧本做了很多工作,比如调用不同的角色和模块,它还收集事实。它以前工作正常,但现在我不确定出了什么问题,感谢任何帮助 主机操作系统为
这是我目前正在使用的 Ansible playbook 的一个示例: --- - hosts: all collections: - mynamespace.my_collection
我需要知道是否可以从目标机器调用/执行 ansible 剧本。我想我看到供应商这样做或至少类似的事情。他们下载了一个脚本,它确实运行了剧本。 如果可能的话,如何实现? 我的目标是在 aws 中将 an
我已在安全中心创建了一个 Playbook,并且可以通过转到安全警报并单击 Playbook 上的“运行”来手动触发该 Playbook。 现在,我希望每当出现新的安全警报时自动触发此 Playboo
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
我是一名优秀的程序员,十分优秀!