修改Ansible/Jinja2中的列表项

Tho*_*ach 5 jinja2 ansible

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

myitems:
  - one
  - two
Run Code Online (Sandbox Code Playgroud)

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

Tho*_*ach 11

...通过在Role的vars/main.yml文件中创建以下两个变量(或者可以定义变量的每个其他位置)来实现这一目的:

interim_string: "{% for item in myitems %}with-{{item}}X {% endfor %}"
result_list: "{{ interim_string.split() }}"
Run Code Online (Sandbox Code Playgroud)

结果result_list现在包含以下值:

- with-oneX
- with-twoX
Run Code Online (Sandbox Code Playgroud)

x在定义之后提到空白interim_string.它用于interim_string再次将列表拆分为列表.您可以通过另一个字符或序列(例如split('#'))进行拆分.但是,这将导致在结尾处的空列表项result_list.


Jus*_*wig 5

现在最好的习惯用法可能是将 Ansible 的地图过滤器与其regex_replace过滤器结合起来。例如,要附加-bar到列表中的每个项目:

myitems:
- one
- two
result_list: "{{ myitems | map('regex_replace', '$', '-bar') | list }}"
Run Code Online (Sandbox Code Playgroud)

这将产生:

result_list:
- one-bar
- two-bar
Run Code Online (Sandbox Code Playgroud)

或者为foo-每个项目添加一个列表:

myitems:
- one
- two
result_list: "{{ myitems | map('regex_replace', '^', 'foo-') | list }}"
Run Code Online (Sandbox Code Playgroud)

这将产生:

result_list:
- foo-one
- foo-two
Run Code Online (Sandbox Code Playgroud)

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

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

这将产生:

result_list:
- foo-one-bar
- foo-two-bar
Run Code Online (Sandbox Code Playgroud)