【问题标题】:ansible Jinja2 template loop for hosts with a var defined定义了 var 的主机的 ansible Jinja2 模板循环
【发布时间】:2015-12-26 03:19:38
【问题描述】:

主机

[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 添加到此循环中,或者我可以通过剧本中的任务生成列表?

【问题讨论】:

    标签: jinja2 ansible-playbook


    【解决方案1】:

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

    可能需要先加载委托事实,然后才能访问主机变量,但我相信如果您需要访问清单中直接定义的任何内容,则不需要这样做。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • zoo_id 指的是当前主机的变量(可能是正在部署配置的主机)。如果您想访问正确的,您需要使用hostvars[server].zoo_id(并且可能在此之前加载委托事实,不确定在库存中定义变量时是否需要它)
      猜你喜欢
      • 2016-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多