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

时间:2018-12-13 08:31:14

标签: ansible jinja2

我想对列表中的每个元素应用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”?

1 个答案:

答案 0 :(得分:1)

您可以使用地图缩小模式来实现。您将首先使用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