具有var定义

时间:2015-09-28 19:37:30

标签: jinja2 ansible-playbook

主机

[mesosSandbox]
mesos1-01d.chalybs.net zoo_id=1
mesos1-02d.chalybs.net zoo_id=2
mesos1-03d.chalybs.net zoo_id=3
mesos1-04d.chalybs.net
mesos1-05d.chalybs.net

我有一个生成zookeeper zoo.cfg

的模板
{% for server in groups[cluster] %}
    server.{{loop.index}}={{server}}:2888:3888
{% endfor %}

有没有办法在此循环中添加if zoo_id is defined,还是可以通过剧本中的任务生成列表?

2 个答案:

答案 0 :(得分:1)

Ansible的if var is defined语法源自jinja。您应该能够在循环中检查动物园ID:

{% for server in groups[cluster] %}
    {% if zoo_id is defined %}
        server.{{loop.index}}={{server}}:2888:3888
    {% endif %}
{% endfor %}

我不能说这是否会在没有看到你的剧本的情况下编译/运行,但假设你的问题中的循环按原样工作,这将允许你过滤是否定义zoo_id

答案 1 :(得分:1)

Ansible的模板语法为Jinja2,因此您可以立即使用它。

此外,您需要使用zoo_id数组访问目标主机的hostvars

{% for server in groups[cluster] %}
    {% if hostvars[server].zoo_id is defined %}
        server.{{loop.index}}={{server}}:2888:3888
    {% endif %}
{% endfor %}

您可能必须先加载委托事实,然后才能访问hostvars,但我认为,如果您需要访问清单中直接定义的任何内容,则不需要。