运行ansible playbook之前进行健全性检查->;计数主机

运行ansible playbook之前进行健全性检查->;计数主机,ansible,ansible-playbook,Ansible,Ansible Playbook,我有一个playbook,它将设置redis集群并作为代理。每个组定义了哪些主机扮演哪些角色。我想在运行任务之前添加一个健全性检查,即: 是否只有一个代理?(A组1台主机) 是否至少有一个redis节点(>=组B中的1台主机) 我已经有了一个解决办法,虽然我觉得这很难看,并且认为必须有更好的办法,但我就是找不到。我当前使用--list hosts参数再次运行一个本地任务调用playbook,并检查输出 - name: Make sure there is only one proxy d

我有一个playbook,它将设置redis集群并作为代理。每个组定义了哪些主机扮演哪些角色。我想在运行任务之前添加一个健全性检查,即:

  • 是否只有一个代理?(A组1台主机)
  • 是否至少有一个redis节点(>=组B中的1台主机)
我已经有了一个解决办法,虽然我觉得这很难看,并且认为必须有更好的办法,但我就是找不到。我当前使用--list hosts参数再次运行一个本地任务调用playbook,并检查输出

  - name: Make sure there is only one proxy defined
    shell: ansible-playbook -i {{ inventory_file }} redis-cluster.yml --tags "redis-proxy" --list-hosts
    register: test
    failed_when: test.stdout.find("host count=1\n") == -1
    changed_when: 1 == 2

这是可行的,但是没有一种简单的方法可以在没有额外呼叫的情况下检查组中的主机数量吗?

您应该能够使用魔术变量来完成这项工作。(请参阅此处的Ansible文档:)

要获取组中的主机数,可以使用
groups['group\u name']
获取组。然后,您可以使用Jinja2文件管理器
length
()获取该组的长度

例如(在剧本中)

(免责声明:我觉得在遇到类似的问题并弄清楚它之后,我应该更正这里给出的另一个答案。)

Woodham提到的关于使用Jinja2过滤器的内容是正确的,但使用不当。它们可以在剧本中使用,但您应该以这种方式使用它们:

vars:
  num_hosts: "{{ groups['redis-proxy'] | length }}"
如您所见,我们可以通过这种方式轻松地进行链式筛选,稍后我们可以检查此变量:

- name: Validate Number of Nodes
  fail: msg="The number of nodes must be exactly 1!"
  when: num_hosts | int != 1
- name: Validate Number of Nodes
  fail: msg="The number of nodes must be exactly 1!"
  when: num_hosts | int != 1