首页 文章

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

提问于
浏览
1

我正在使用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

How can I distinguish between a list and a string in Jinja?

1 回答

  • 2

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

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

相关问题