在运行ansible playbook之前进行健全检查 - >统计主机

时间:2014-07-07 08:20:01

标签: ansible ansible-playbook

我有一个将设置redis群集和nutcracker作为代理的手册。哪些主机可以播放每个组定义的角色。我想在运行任务之前添加一个健全性检查,即:

  • 是否只有一个代理? (A组中的1名主持人)
  • 是否至少有一个redis节点(> = B组中的1个主机)

我已经有了一个解决方案,虽然我觉得它非常丑陋,并且认为必须有更好的东西,但我无法找到它。我目前运行一个本地任务,再次使用--list-hosts参数调用该剧本并检查输出。

  - 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

虽然有效,但是没有一个简单的方法可以在没有额外通话的情况下检查群组中的主机数量?

2 个答案:

答案 0 :(得分:22)

(免责声明:我觉得我遇到类似的问题并弄清楚我应该纠正这里给出的其他答案。)

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

答案 1 :(得分:1)

您应该可以使用魔术变量来执行此操作。 (请参阅此处的Ansible文档:http://docs.ansible.com/playbooks_variables.html#magic-variables-and-how-to-access-information-about-other-hosts

要获取组中的主机数,您可以使用groups['group_name']获取该组。然后,您可以使用Jinja2文件管理器lengthhttp://jinja.pocoo.org/docs/templates/#length)来获取该组的长度。

E.g。 (在剧本中)

vars:
    num_redis_proxy_hosts: length(groups['redis-proxy'])