我有一个将设置redis群集和nutcracker作为代理的手册。哪些主机可以播放每个组定义的角色。我想在运行任务之前添加一个健全性检查,即:
我已经有了一个解决方案,虽然我觉得它非常丑陋,并且认为必须有更好的东西,但我无法找到它。我目前运行一个本地任务,再次使用--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
虽然有效,但是没有一个简单的方法可以在没有额外通话的情况下检查群组中的主机数量?
答案 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文件管理器length
(http://jinja.pocoo.org/docs/templates/#length)来获取该组的长度。
E.g。 (在剧本中)
vars:
num_redis_proxy_hosts: length(groups['redis-proxy'])