Filter 如何将某些项目值转换为新项目值?

Filter 如何将某些项目值转换为新项目值?,filter,ansible,jinja2,Filter,Ansible,Jinja2,这是我的变量: 区域: -主机名:host10 cname:{{cname1 |默认值(省略)}” 区域:[“v120”、“v121”、“linux”] ips:8 -主机名:host11 cname:{{cname2 |默认值(省略)}” 区域:[“v120”、“v121”] ips:10 -主机名:host12 区域:[linux] ips:88 我如何在zones.zone上构建相同的var,而只需很少的替换(将v120替换为120,将v121替换为121,将linux替换为v120):

这是我的变量:

区域:
-主机名:host10
cname:{{cname1 |默认值(省略)}”
区域:[“v120”、“v121”、“linux”]
ips:8
-主机名:host11
cname:{{cname2 |默认值(省略)}”
区域:[“v120”、“v121”]
ips:10
-主机名:host12
区域:[linux]
ips:88
我如何在zones.zone上构建相同的var,而只需很少的替换(将v120替换为120,将v121替换为121,将linux替换为v120):

区域:
-主机名:host10
cname:{{cname1 |默认值(省略)}”
分区:[“120”、“121”、“120”]
ips:8
-主机名:host11
cname:{{cname2 |默认值(省略)}”
分区:[“120”、“121”]
ips:10
-主机名:host12
分区:[120]
ips:88
我用一些过滤器尝试了很多组合,特别是“combine”和“regex_replace”

regex\u替换(“^v(.*)$”,“\\1”)
但从未成功实现最终目标。这似乎很简单,我肯定错过了一些东西…

创建字典替换和迭代区域。在每次迭代中,提取替换区域,将字典与项组合,并连接列表区域2。比如说

-设置事实:
分区2:“{{zones2 |默认值([]))+
[项目|合并({'zone':zone})]}”
循环:“{zones}}”
变量:
区域:{{item.zone | map('extract',substitute)| list}”
替换:
v120:120
v121:121
linux:120
-调试:
变量:分区2
给予

2区:
-主机名:host10
ips:8
区域:
- 120
- 121
- 120
-主机名:host11
ips:10
区域:
- 120
- 121
-主机名:host12
ips:88
区域:
- 120

映射regex_替换

-设置事实:
分区2:“{{zones2 |默认值([]))+
[项目|合并({'zone':zone})]}”
循环:“{zones}}”
变量:
区域:“{{item.zone”|
映射('regex_replace',regex,replace)|
映射('regex_replace',regex2,replace2)|
列表}”
正则表达式:“^v(.*)”
替换:'\1'
regex2:“^linux$”
替换2:‘120’
-调试:
变量:分区2
给予

2区:
-主机名:host10
ips:8
区域:
- '120'
- '121'
- '120'
-主机名:host11
ips:10
区域:
- '120'
- '121'
-主机名:host12
ips:88
区域:
- '120'

“了解提取过滤器的作用”

显示过滤器的结果

-调试:
味精:|
{{item.zone | to_yaml}{{{zone | to_yaml}}
循环:“{zones}}”
变量:
区域:{{item.zone | map('extract',substitute)| list}”
替换:
v120:120
v121:121
linux:120
给出(节略)

msg:|-
[v120、v121、linux]
[120, 121, 120]
味精:|-
[v120,v121]
[120, 121]
味精:|-
[linux]
[120]

“了解联合收割机解决方案的作用”

显示过滤器的结果

-调试:
msg:{{item | combine({'zone':zone})|
“给_yaml}”
循环:“{zones}}”
变量:
区域:{{item.zone | map('extract',substitute)| list}”
替换:
v120:120
v121:121
linux:120
给出(节略)

msg:|-
cname:uuu省略_u放置_u支架_uuu3938838202C238B505BFC39AF57A09B4FE9972F6
主机名:host10
ips:8
区域:[120121120]
味精:|-
cname:uuu省略_u放置_u支架_uuu3938838202C238B505BFC39AF57A09B4FE9972F6
主机名:host11
ips:10
分区:[120121]
味精:|-
主机名:host12
ips:88
分区:[120]

“区域2”:“[AnsibleUndefined,AnsibleUndefined]”你怎么解释呢?

下面的代码按预期工作

-设置事实:
分区2:“{item.zone | map('extract',substitute)| list}”
循环:“{zones}}”
注册:分区列表
变量:
替换:
v120:120
v121:121
linux:120
-调试:
msg:{zones_list.results|map(attribute='ansible_facts')| list|
“给_yaml}”
给出(节略)

msg:|-
-分区2:[120121120]
-分区2:[120121]
-分区2:[120]

您的风险值是否存在于剧本或模板中?你在试着写剧本吗?详细描述你拥有的以及你想做的事情。参见。系统负责适当变量的评估,例如,如果区域包含项,则将在每次迭代中对其进行评估。为了了解组合解决方案的作用,我隔离了替换循环:
-set_事实:区域2:“{item.zone | map('extract',substitute)| list}”替换:v120:120 v121:121 linux:120循环:“{{zones}”寄存器:zones_list-debug:msg:“{{zones_list.results{124; map(attribute='ansible_facts')| list}”
但是调试消息说
“zones2:“[AnsibleUndefined,AnsibleUndefined]”
,用于第一次迭代。奇怪的是,剧本中包含的这段代码非常有效。你怎么解释呢?我没有解释。您的示例的格式不清楚。我已经添加了调试示例。如果有其他问题,请打开一个新问题。答案很简单,我错过了“替换”之前的“vars”项。。。谢谢你,现在一切都清楚全面了,你帮了我很多。