繁体   English   中英

如何附加到 jinja2 中的列表以获取 ansible

[英]how to append to a list in jinja2 for ansible

下面是我编写的用于 ansible 的 jinja2 模板。

{% set port = 1234 %}
{% set server_ip = [] %}
{% for ip in host_ip  %}
{% do server_ip.append({{ ip }}:{{ port }}) %}
{% endfor %}
{% server_ip|join(', ') %}

下面是我想要的输出:

devices = 192.168.56.14:1234,192.168.56.13:1234,192.168.56.10:1234

但是当我运行 ansible playbook 时,它会抛出如下错误:

"AnsibleError: teme templating string: Encountered unknown tag 'do'. Jinja was looking for th: 'endfor' or 'else'

任何帮助,将不胜感激..

试试下面的代码:

{% set port = '1234' %}
{% set server_ip = [] %}
{% for ip in host_ip  %}
{{ server_ip.append( ip+":"+port ) }}
{% endfor %}
{{ server_ip|join(',') }}

你会得到:

192.168.56.14:1234,192.168.56.13:1234,192.168.56.10:1234

这对我有用:

- set_fact:
    devices: >-
      {% for ip in host_ip %}{{ ip }}:1234{% if not loop.last %},{% endif %}{% endfor %}

如果您仍想使用do然后添加

jinja2_extensions = jinja2.ext.do

到您的 ansible 配置文件并更改

{% do server_ip.append({{ ip }}:{{ port }}) %}` to `{% do server_ip.append({ip:port}) %}`

我不喜欢任何答案,他们觉得太老套了(不得不担心输出None或使用其他技术的虚假空白),但我认为我找到了一个行之有效的解决方案。 我从一个相关问题的答案中获得灵感,并意识到您可以为同一个变量多次调用set并且似乎不会受到任何惩罚。

它仍然有点hacky,因为我不认为它打算像这样工作(再说一次,Jinja 中的几个设计决策让我摸不着头脑,所以谁知道)。

{% set server_ip = server_ip.append({{ ip }}:{{ port }}) %}

有趣的是,虽然该值确实附加到server_ip ,但该附加的返回值(我们现在非常清楚是None )没有分配回 LHS 上的server_ip 这让我发现声明的 LHS 方面似乎是无操作的。

所以你也可以这样做并且附加工作:

{% set tmp = server_ip.append({{ ip }}:{{ port }}) %}

然而,如果你打印tmp ,什么都不会出现。 去搞清楚。

为了避免使用{{ server_ip.append( ip+":"+port ) }}完全打印None (只花了 20 分钟调试这个),如果你不想使用误导性{% set _ = server_ip.append( ip+":"+port ) %} ,您可以回到 Python 基础并执行以下操作:


# Remember that [1, 2] + [3] = [1, 2, 3]

{% set server_ip = server_ip + [ip+":"+port] %}

在 99.9% 的情况下,这将起作用。 但是,在使用非常大的列表的特殊情况下,在内存使用方面可能会有一个小的性能下降:在上面的示例中, [1, 2] + [3] = [1, 2, 3] ,两者[1, 2][1, 2, 3] (初始和修改列表)将在内存中共存片刻,这与append方法相反,它不会在内存中创建额外的对象。

使用map()regex的单线解决方案:

{{ ["1.1.1.1","2.2.2.2"]|map('regex_replace', '(.+)', "\\1:1234")|join(', ') }}

map('regex_replace', '(.+)', "\\1:1234"):1234添加到传递的数组["1.1.1.1","2.2.2.2"]中的任何非空字符串(.+) ["1.1.1.1","2.2.2.2"] . 结果:

1.1.1.1:1234, 2.2.2.2:1234

投票最多的答案将导致渲染结果中出现大量空格。 除了使用 jinja 的do扩展外,另一种解决方案是使用 jinja 的空白控制 添加减号-在块内

{%- for ip in host_ip -%}...{%- endfor %}

将删除空格。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM