在Ansible中,如何对列表应用标量筛选器

在Ansible中,如何对列表应用标量筛选器,ansible,jinja2,Ansible,Jinja2,我想对列表中的每个元素应用ansible筛选器,然后从中创建一个字符串。假设我有一张清单 my_files: - /etc/passwd - /etc/group 然后在ansible任务中,我想创建一个字符串,比如“passwd,group”。如果没有过滤,这可以通过jinja语法完成 {{ ",".join(my_files) }} 这将创建一个字符串“/etc/passwd,/etc/group”。但是现在我想对每个元素应用ansible basename过滤器。对于标

我想对列表中的每个元素应用ansible筛选器,然后从中创建一个字符串。假设我有一张清单

my_files:
    - /etc/passwd
    - /etc/group
然后在ansible任务中,我想创建一个字符串,比如“passwd,group”。如果没有过滤,这可以通过jinja语法完成

{{ ",".join(my_files) }}
这将创建一个字符串“/etc/passwd,/etc/group”。但是现在我想对每个元素应用ansible basename过滤器。对于标量,这就像

{{ /etc/passwd | basename }}

这将生成字符串“passwd”。所以问题是,如何结合这两个操作从列表my_文件生成字符串“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

您可以使用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

谢谢,正是我想要的!谢谢,正是我想要的!