修改 Ansible / Jinja2 中的列表项



例如,您的角色中有一个列表变量...

myitems:
  - one
  - two

。并且想要修改 Ansible 中的每个项目(例如,在之前/之后附加一个字符串),您可以...

...通过在角色的vars/main.yml文件中(或在可以定义 var 的每个其他位置)创建以下两个变量来做到这一点:

interim_string: "{% for item in myitems %}with-{{item}}X {% endfor %}"
result_list: "{{ interim_string.split() }}"

生成的result_list现在包含以下值:

- with-oneX
- with-twoX

定义interim_string时提及x后面的空格。它用于再次将interim_string拆分为列表。您可以按另一个字符或序列拆分(例如 split('#') )。但是,这将导致result_list末尾的列表项为空。

如今,最好的成语可能是将 Ansible 的地图过滤器与其regex_replace过滤器相结合。例如,要将-bar追加到列表中的每个项目,请执行以下操作:

myitems:
- one
- two
result_list: "{{ myitems | map('regex_replace', '$', '-bar') | list }}"

这将产生:

result_list:
- one-bar
- two-bar
<小时 />

或者将foo-附加到每个项目前面一个列表:

myitems:
- one
- two
result_list: "{{ myitems | map('regex_replace', '^', 'foo-') | list }}"

这将产生:

result_list:
- foo-one
- foo-two
<小时 />

或者用 foo--bar 将每个项目包装在一个列表中:

myitems:
- one
- two
result_list: "{{ myitems | map('regex_replace', '(.+)', 'foo-\1-bar') | list }}"

这将产生:

result_list:
- foo-one-bar
- foo-two-bar

我发现的另一种实现类似结果的方法:

{{ ansible_play_hosts | zip_longest([], fillvalue=':2181')| map('join') | join(',') }}

看起来很丑,但考虑到ansible_play_hosts=['a', 'b']它会产生a:2181,b:2181

最新更新