【发布时间】:2015-02-17 02:49:28
【问题描述】:
我有 2 个剧本在 ansible 上运行,一个接一个。剧本 1 完成后,我想仅在第一个剧本完全成功的主机上运行第二个。浏览 ansible 文档,我找不到任何关于哪些主机未能通过特定剧本的可访问信息。这怎么可能?
仅供参考,我需要单独的剧本,因为第二个必须以串行方式运行,即only available at the playbook level
【问题讨论】:
我有 2 个剧本在 ansible 上运行,一个接一个。剧本 1 完成后,我想仅在第一个剧本完全成功的主机上运行第二个。浏览 ansible 文档,我找不到任何关于哪些主机未能通过特定剧本的可访问信息。这怎么可能?
仅供参考,我需要单独的剧本,因为第二个必须以串行方式运行,即only available at the playbook level
【问题讨论】:
其中all hosts - successful hosts = failed hosts,可以使用下面的任务来获取剧中所有主机(包括故障主机)和所有还没有故障的主机的两个特殊变量的区别。使用serial 会影响结果。
- name: Print play hosts that failed
debug:
msg: "The hosts that failed are {{ ansible_play_hosts_all| difference(ansible_play_batch) |join('\n') }}"
来源:https://docs.ansible.com/ansible/latest/reference_appendices/special_variables.html
【讨论】:
老实说,最好的方法是在每个主机上设置一些可查询的状态。一个简单的方法是检查文件是否存在,该文件是在您的第一个剧本成功后创建的。然后,您可以有一个任务来检查该状态并通知通知任务它已“更新”,这将得到您想要的。
顺便说一句,我停止使用 ansible 是因为它的可配置性不够;我在获得我想要的并行控制时也遇到了问题。您可以尝试拨打Ansible Project Google Group 来提出功能建议或描述您的用例。
【讨论】:
play 和 playbook 之间存在差异。 serial 参数在 play 级别上可用。一个playbook 可能包含多个plays。
---
- name: Play 1
hosts: some_hosts
tasks:
- debug:
- name: Play 2
hosts: some_hosts
serial: 1
tasks:
- debug:
...
在播放 1 中失败的主机将不会在播放 2 中处理。
如果您真的想拥有单独的剧本,我看到了两个选择:
创建一个callback plugin。您可以注册一个在任务或主机失败时触发的函数。您可以将这些信息存储在本地,并在下一次 playbook 运行中使用。
激活 Ansible logging。在运行ansible-playbook 时,它将记录几乎与您看到的原始输出相同的内容。
第二个选项有点丑,但比创建回调插件更容易。
在这两种情况下,您都需要创建一个dynamic inventory script,它会检查以前保存的数据并返回有效的主机。或者返回所有主机,但设置一个属性来标记这些主机。然后您可以使用group_by 创建一个临时组。
【讨论】: