修改 Ansible / Jinja2 中的列表项
Modify list items in Ansible / Jinja2
例如,您的角色中有一个列表变量...
myitems:
- one
- two
...并且想要修改 Ansible 中的每个项目(例如附加一个字符串 before/after),您可以...
...通过在角色的 vars/main.yml
文件中(或在可以定义变量的所有其他地方)创建以下两个变量来达到目的:
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_play_hosts | zip_longest([], fillvalue=':2181')| map('join') | join(',') }}
看起来很丑,但考虑到 ansible_play_hosts=['a', 'b']
它会产生 a:2181,b:2181
如今最好的做法可能是将 Ansible 的 map 过滤器与其 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
例如,您的角色中有一个列表变量...
myitems:
- one
- two
...并且想要修改 Ansible 中的每个项目(例如附加一个字符串 before/after),您可以...
...通过在角色的 vars/main.yml
文件中(或在可以定义变量的所有其他地方)创建以下两个变量来达到目的:
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_play_hosts | zip_longest([], fillvalue=':2181')| map('join') | join(',') }}
看起来很丑,但考虑到 ansible_play_hosts=['a', 'b']
它会产生 a:2181,b:2181
如今最好的做法可能是将 Ansible 的 map 过滤器与其 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