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

jan*_*neb 1 jinja2 ansible

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

my_files:
    - /etc/passwd
    - /etc/group
Run Code Online (Sandbox Code Playgroud)

然后在 ansible 任务中我想创建一个像“passwd,group”这样的字符串。如果没有过滤,可以使用 jinja 语法来完成

{{ ",".join(my_files) }}
Run Code Online (Sandbox Code Playgroud)

这将创建一个字符串“/etc/passwd,/etc/group”。但现在我想将 ansible 基本名称过滤器应用于每个元素。对于标量,其工作原理如下

{{ /etc/passwd | basename }}
Run Code Online (Sandbox Code Playgroud)

这将生成字符串“passwd”。那么问题是,如何组合这两个操作来从列表 my_files 中生成字符串“passwd,group”?

yam*_*enk 5

您可以使用地图缩减模式来实现这一点。您将首先使用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
Run Code Online (Sandbox Code Playgroud)