Jinja条件子句依赖于数据类型

时间:2016-07-14 19:33:47

标签: python jinja2 salt-stack

我使用SaltStack来管理BIND9区域文件。以前我使用了这样的支柱数据:

zones:
  example.com:
    a:
      www1: 1.2.3.4
      www2: 1.2.3.5

以及jinja模板化文件(为了便于阅读而缩进),如下所示:

{% if info.a is defined %}
  {% for host, defn in info.a.items() %}
    {{ host }}  IN  A  {{ defn }}
  {% endfor %}
{% endif %}

其中info是一个上下文变量(zones.example.com处的字典)。

现在,我需要能够为每条A记录定义多个IP。在前面的示例中,假设我想循环子域www

zones:
  example.com:
    a:
      www1: 1.2.3.4
      www2: 1.2.3.5
      www:
        - 1.2.3.4
        - 1.2.3.5

这需要 - 在Jinja模板中 - 知道defn是标量值(表示单个IP地址)或列表(表示IP地址集合)之间的区别。类似的东西:

    {% for host, defn in info.a.items() %}
      {% if DEFN_IS_A_LIST_OBJECT %}
        {% for ip in defn %}
          {{ host }} IN A {{ ip }}
        {% endfor %}
      {% else %}
        {{ host }} IN A {{ defn }}
      {% endif %}
    {% endfor %}

this thread我尝试了if isinstance(defn, list),但我得到了:

Unable to manage file: Jinja variable 'isinstance' is undefined

我也试过if len(defn)但是实现了length()会将Truthy响应为字符串和列表。它也被报告为错误:

Unable to manage file: Jinja variable 'len' is undefined

如何区分Jinja中的列表和字符串?

1 个答案:

答案 0 :(得分:2)

如果值只能是字符串或列表,您可以检查这不是包含builtin test的字符串

{% if defn is not string %}
    {% for ip in defn %}
        {{ host }} IN A {{ ip }}
    {% endfor %}
{% else %}