在Ansible中,介绍如何将标量过滤器应用于列表



我想对列表中的每个元素应用一个ansible过滤器,然后从中创建一个字符串

my_files:
- /etc/passwd
- /etc/group

然后在一个易解析的任务中,我想创建一个类似"passwd,group"的字符串。没有过滤,这可以用jinja语法来完成

{{ ",".join(my_files) }}

这将创建一个字符串"/etc/passwd,/etc/group"。但现在我想将ansible basename过滤器应用于每个元素。对于标量,这与类似

{{ /etc/passwd | basename }}

这将生成字符串"passwd"。因此,问题是,如何将这两个操作结合起来,从my_files列表中生成字符串"passwd,group"?

您可以使用map reduce模式来实现这一点。您将首先使用basename过滤器映射每个条目,然后加入生成的列表。

以下行动手册演示了如何做到这一点:

- hosts: localhost
gather_facts: false
vars:
my_files:
- /etc/passwd
- /etc/group
tasks:
- name: MapReduce
debug:
msg: "{{ my_files | map('basename') | list | join(',')}}" # results in passwd,group

最新更新