用于定义了 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
是否是定义。
Ansible的模板语法是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 之前加载委托事实,但我相信如果您需要访问直接在清单中定义的任何内容,则不需要。
主机
[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
是否是定义。
Ansible的模板语法是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 之前加载委托事实,但我相信如果您需要访问直接在清单中定义的任何内容,则不需要。