9

我有一本剧本,它将设置一个 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

这行得通,但是没有这种额外的调用就没有一种简单的方法来检查组中的主机数量吗?

4

2 回答 2

24

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

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
于 2014-09-15T16:32:14.820 回答
1

您应该能够使用魔法变量来做到这一点。(请参阅此处的 Ansible 文档:http: //docs.ansible.com/playbooks_variables.html#magic-variables-and-how-to-access-information-about-other-hosts

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

例如(在剧本中)

vars:
    num_redis_proxy_hosts: length(groups['redis-proxy'])
于 2014-07-07T09:27:59.620 回答