例如,你的角色中有一个列表变量......
myitems:
- one
- two
...并希望修改Ansible中的每个项目(例如在之前/之后附加一个字符串),你可以......
答案 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
在定义x
时interim_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