在Ansible/Jinja2中格式化项目列表

在Ansible/Jinja2中格式化项目列表,ansible,jinja2,Ansible,Jinja2,是否可以使用Ansible/Jinja2中的格式字符串将列表/目录列表转换为字符串列表 我知道我可以做以下事情: {{["First: %d", "Second: %d"] | map("format", 1) | join(", ") }} 要获取第一个:1,第二个1 有可能像这样做吗 {{[[1, 1], [2, 2]] | map("format", "Num %d, %d&qu

是否可以使用Ansible/Jinja2中的格式字符串将列表/目录列表转换为字符串列表

我知道我可以做以下事情:

{{["First: %d", "Second: %d"] | map("format", 1) | join(", ") }}
要获取
第一个:1,第二个1

有可能像这样做吗

{{[[1, 1], [2, 2]] | map("format", "Num %d, %d") | join(", ") }}

并导致
Num 1,1,Num 2,2

否。这是不可能的。格式的参数反之亦然,例如

-调试:
msg:{{['v1%s','v2%s']| map('format','XYZ')| list}
给予

msg:
-v1-XYZ
-v2 XYZ
相反,可以映射join和regex_replace,例如

-调试:
msg:“{{{u列表|
映射('连接',',')|
映射('regex_replace','u regex','u replace)|
连接(',')}”
变量:
_清单:[[1,1],[2,2]]
_正则表达式:'^(.*),(.*)$'
_替换:“Num\1\2”
做这项工作

msg:Num 1,1,Num 2,2

核心
格式
过滤器无法实现此功能。但是,如果您愿意编写几行python,可以使用自定义过滤器轻松地解决这个问题。我使用了最简单的示例,您可能需要强化代码并修复边缘情况,以供实际使用。您可能需要查看以了解更多信息

对于本例,我将在中保存自定义文件。如果要在不同的项目中共享,可以将其保存在或中

filter\u plugins/my\u format\u filters.py中


def反向格式(参数列表、格式字符串):
“”“使用参数列表中的元素设置格式”“”
返回格式字符串%tuple(参数列表)
类FilterModule(对象):
“”“我的格式筛选器。”“”
def过滤器(自):
“”“返回筛选器列表。”“”
返回{
“反向\u格式”:反向\u格式
}
然后是以下示例剧本:

---
-名称:自定义过滤器演示
主机:本地主机
收集事实:错误
任务:
-名称:映射自定义反向_格式筛选器
调试:
msg:“{item.replacements | map(“reverse_format”,item.format)| join(“,”)}”
循环:
-替换:
- [1, 1]
- [2, 2]
格式:“数量%d,%d”
-替换:
-[杰克,约翰,12]
-['Mary','Alicia',34]
格式:“%s欠%s%d欧元”
给出:

PLAY [custom filter demo] **************************************************************************************************************************************************************************************************************

TASK [map custom reverse_format filter] ************************************************************************************************************************************************************************************************
ok: [localhost] => (item={'replacements': [[1, 1], [2, 2]], 'format': 'Num %d, %d'}) => {
    "msg": "Num 1, 1, Num 2, 2"
}
ok: [localhost] => (item={'replacements': [['Jack', 'John', 12], ['Mary', 'Alicia', 34]], 'format': '%s owes %s %d€'}) => {
    "msg": "Jack owes John 12€, Mary owes Alicia 34€"
}

PLAY RECAP *****************************************************************************************************************************************************************************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0