Jinja2模板输出解析为逗号问题

时间:2019-11-08 23:28:01

标签: ansible jinja2 ansible-template jinja2-cli

我已经为ansible剧本编写了jinja2模板。但是,由于这个原因,我不想在最后一行的末尾使用逗号,我已经将“ if”条件与“ loop.last”一起使用了。由于存在“ 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" ]

谢谢

2 个答案:

答案 0 :(得分: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]$ 

希望有帮助

答案 1 :(得分:0)

  1. 您应特别注意您的var名称。 range实际上是jinja2 function,有时可能会导致错误。
  2. 您当前的问题基本上归结为通过添加前缀并将结果输出为json字符串来转换输入列表。

在下面的示例中:

  • 首字母range(6001,6007)动态地将您当前的var替换为相同数量的值(例如)。您可以简单地用包含实际值列表的重命名变量替换此函数(请参见上面的第1点)。
  • 我将regex_replace filtermap一起使用,将127.0.0.1:放在列表中的每个值之前。
  • 最后,我使用to_json filter将列表输出为所需格式。

最终模板:

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

我们可以通过一个简单的调试任务轻松地对其进行测试:

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