我想对列表中的每个元素应用一个 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”?
您可以使用地图缩减模式来实现这一点。您将首先使用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)
| 归档时间: |
|
| 查看次数: |
3385 次 |
| 最近记录: |