我有两个剧本在ansible上运行,一个接一个。在Playbook 1完成后,我想在仅第一个playbook完全成功的主机上运行第二个。通过ansible文档,我找不到任何主机在特定剧本上失败的可访问信息。怎么可以这样做?
仅供参考我需要单独的剧本,因为第二部必须连续播放,only available at the playbook level
答案 0 :(得分:1)
老实说,最好的方法是在每台主机上都有一些可查询的状态。一个简单的方法是检查文件的存在,这是在第一个playbook成功后创建的。然后,您可以拥有一个检查该状态的任务,并通知通知任务它已被“更新”,这将获得您想要的结果。
在一旁,我停止使用ansible,因为它不够可配置;我也遇到了我想要的并行控制问题。您尝试点击Ansible Project Google Group以提出功能建议或描述您的用例。
答案 1 :(得分:1)
在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
答案 2 :(得分:0)
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。您可以注册在任务或主机发生故障时被触发的函数。您可以在本地存储此信息,并在下一个剧本运行中使用。
激活Ansible logging。在运行ansible-playbook
时,它会记录与您看到的原始输出相同的内容。
第二个选项有点难看,但比创建回调插件更容易。
在这两种情况下,您需要创建一个dynamic inventory script来检查以前保存的数据并返回有效的主机。或者返回所有主机,但设置属性以标记这些主机。然后,您可以使用group_by
创建一个ad-hoc组。