修改Ansible / Jinja2中的列表项

时间:2016-02-01 23:21:12

标签: jinja2 ansible

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

myitems:
  - one
  - two

...并希望修改Ansible中的每个项目(例如在之前/之后附加一个字符串),你可以......

3 个答案:

答案 0 :(得分:10)

...通过在角色的vars/main.yml文件中创建以下两个变量(或者在可以定义变量的每个其他位置)来执行此操作:

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

结果result_list现在包含以下值:

- with-oneX
- with-twoX

在定义xinterim_string之后提及空格。它用于将interim_string再次拆分为列表。您可以按其他字符或序列进行拆分(例如split('#'))。但是,这会导致result_list

末尾的空列表项

答案 1 :(得分:1)

我发现了另一种获得类似结果的方法:

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

看起来很丑,但是ansible_play_hosts=['a', 'b']会产生a:2181,b:2181

答案 2 :(得分:1)

如今,最好的习惯用法可能是将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