【问题标题】:Jinja2 template output parsing issue for comma逗号的Jinja2模板输出解析问题
【发布时间】:2019-11-08 23:28:01
【问题描述】:

我已经为 ansible playbook 编写了 jinja2 模板。但是,出于这个原因,我不想在最后一行末尾使用逗号,我使用了带有“loop.last”的“if”条件。由于存在“for”循环和“if”循环,因此最后一行执行了两次——一次使用逗号,另一次不使用逗号。如果最后一行不带逗号执行一次,我们将不胜感激。

  [{% for ip in range  %}
  "127.0.0.1:{{ ip }}",
     {% if loop.last %}
       "127.0.0.1:{{ ip }}"
     {% endif %}
  {% endfor %}]

下面是我得到的输出,

[  "127.0.0.1:6000",
         "127.0.0.1:6001",
         "127.0.0.1:6002",
         "127.0.0.1:6003",
         "127.0.0.1:6004",
         "127.0.0.1:6005",
         "127.0.0.1:6006",
            "127.0.0.1:6006"
       ]

预期输出:

  ["127.0.0.1:6000", "127.0.0.1:6001", "127.0.0.1:6002", "127.0.0.1:6003", "127.0.0.1:6004", "127.0.0.1:6005", "127.0.0.1:6006" ]

谢谢

【问题讨论】:

    标签: ansible jinja2 ansible-template jinja2-cli


    【解决方案1】:

    您可以为非最后一次迭代添加一个else 子句。试试这个模板文件:

    [{% for ip in range  %}
    {% if loop.last %}
    "127.0.0.1:{{ ip }}"{% else %}
    "127.0.0.1:{{ ip }}", {% endif %}
    {% endfor %}]
    

    制作文件:

    [root@greenhat-30 tests]$ cat /tmp/test.out         
    ["127.0.0.1:6001", "127.0.0.1:6002", "127.0.0.1:6003", "127.0.0.1:6004", "127.0.0.1:6005", "127.0.0.1:6006"]
    [root@greenhat-30 tests]$ 
    

    希望对你有帮助

    【讨论】:

      【解决方案2】:
      1. 您应该格外小心您的 var 名称。 range 实际上是 jinja2 function,有时可能会导致错误。
      2. 您当前的问题基本上归结为通过添加前缀来转换输入列表并将结果输出为 json 字符串。

      在下面的例子中:

      • 初始的range(6001,6007) 用相同数量的值动态替换您当前的变量(例如)。您可以简单地用包含实际值列表的重命名变量替换此函数(参见上面的第 1 点)。
      • 我使用regex_replace filtermap127.0.0.1: 添加到列表中的每个值。
      • 最后,我使用to_json filter 将列表输出为所需的格式。

      最终模板:

      {{ range(6001,6007) | map('regex_replace','^', '127.0.0.1:') | list | to_json }}
      

      我们可以通过 ansible 调试任务轻松测试:

      ---
      - name: Demo template
        hosts : localhost
        gather_facts: false
      
        tasks:
      
          - name: Add prefix to range list and output json
            debug:
              msg: "{{ range(6001,6007) | map('regex_replace','^', '127.0.0.1:') | list | to_json }}"
      

      这给出了(注意:反斜杠是由调试添加的,以转义结果字符串中的双引号。结果模板中的实际输出将不包含它们。)

      PLAY [Demo template] ****************************************************************************************************************************************************************************************************************************************************
      
      TASK [Add prefix to range list and output json] *************************************************************************************************************************************************************************************************************************
      ok: [localhost] => {
          "msg": "[\"127.0.0.1:6001\", \"127.0.0.1:6002\", \"127.0.0.1:6003\", \"127.0.0.1:6004\", \"127.0.0.1:6005\", \"127.0.0.1:6006\"]"
      }
      
      PLAY RECAP **************************************************************************************************************************************************************************************************************************************************************
      localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 
      

      【讨论】:

      • 感谢您的回复。我从你的帖子中学到了一种新的做法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-27
      • 2011-03-04
      • 2019-03-08
      • 1970-01-01
      • 1970-01-01
      • 2018-08-26
      • 1970-01-01
      相关资源
      最近更新 更多