用于定义了 var 的主机的 ansible Jinja2 模板循环

ansible Jinja2 template loop for hosts with a var defined

主机

[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

我有一个生成动物园管理员的模板zoo.cfg

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

有没有办法向这个循环添加 if zoo_id is defined 或者我可以通过剧本中的任务生成列表?

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 %}

我不能说这是否会 compile/run 没有看到更多你的剧本,但假设你问题中的循环按原样工作,这将允许你过滤 zoo_id 是否是定义。

A​​nsible的模板语法是Jinja2,所以你可以马上使用它。

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

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

可能需要在能够访问 hostvars 之前加载委托事实,但我相信如果您需要访问直接在清单中定义的任何内容,则不需要。