Ansible jinja测试列表如果包含有效的IP地址并生成模板

Ansible jinja测试列表如果包含有效的IP地址并生成模板,ansible,jmespath,Ansible,Jmespath,Ansible中有以下变量: 我的\u允许\u主机2: -{主机:修补程序,地址:'202.167.24.50'} -{host:localhost,地址:'::1/128',额外_字段:trust} my_ferm_组: -防火墙\u白名单1 -防火墙\u白名单2 我有一个任务,检查我的允许的主机2中是否有有效的IP地址,如果有,为它生成一个模板。在这种情况下,我运行playbook的主机位于我的资源清册中的firewall\u whitelist2组中。然后使用此模板生成ferm/iptab

Ansible中有以下变量:

我的\u允许\u主机2: -{主机:修补程序,地址:'202.167.24.50'} -{host:localhost,地址:'::1/128',额外_字段:trust} my_ferm_组: -防火墙\u白名单1 -防火墙\u白名单2 我有一个任务,检查我的允许的主机2中是否有有效的IP地址,如果有,为它生成一个模板。在这种情况下,我运行playbook的主机位于我的资源清册中的firewall\u whitelist2组中。然后使用此模板生成ferm/iptable规则,以允许my_allowed_hosts2中的IP地址访问主机

但是,如果my_allowed_hosts2中没有有效地址,我不想为其生成模板firewall_whitelist_2,即使myhost是该组的有效成员-因为如果它没有有效的IP地址,模板将变得无效。希望到目前为止我讲得通

相关任务:

-设定事实: 有效的_地址:{my_allowed_hosts2 | json_query'[*].address'| map'ipaddr'|拒绝'match','^127.0.0.1 |:::1/128'| list} -调试: msg:{{有效地址}} -名称:循环字典和复制组配置到位 模板:src=etc/ferm/ferm.d/{{item}.j2 dest=/etc/ferm/ferm.d/{{item}.conf owner=根组=根模式=0640 时间:my_ferm_组中的项目 与{u项:{group_names{124;拒绝'match',“^firewall_whitelist2$”如果有效的{u地址不存在} 我在上面试图做的是,如果我的允许的主机2列表中没有测试的真实值,则尝试从循环中删除firewall\u whitelist2,从而阻止它创建特定的模板

但是,我收到以下错误:

如果有效的_地址不是空的,我所期望的是如下所示。相应地复制模板:

确定:[myhost]=>item=firewall\u whitelist1=>{ansible\u loop\u var:item,changed:false,校验和:21f42490d91da92c6f404a30df6e3473266b72f,dest:/etc/ferm/ferm.d/firewall\u whitelist1.j2,gid:0,group:root,item:firewall\u whitelist1,mode:0640,owner:root,path:/etc/ferm/ferm.d/firewall\u whitelist1.conf,secontext:system\u:object\u r:etc\u t:s0,size:570,state:file,uid:0} 已更改:[myhost]=>item=firewall\u whitelist2=>{ansible_loop_var:item,changed:false,checksum:985d207faa196b285c20c7f60f6aa69b23f908b9,dest:/etc/ferm/ferm.d/firewall_whitelist2.j2,gid:0,group:root,item:firewall_whitelist2,mode:0640,owner:root,path:/etc/ferm/ferm.d/firewall_whitelist2.conf,secontext:system_:object\u r:etc\u t:s0,size:705,state:file,uid:0} 我也尝试过这样做,试图将firewall\u whitelist2添加到列表中,以便仅在有效的\u地址不为空时生成模板:

-名称:循环字典和复制组配置到位 模板:src=etc/ferm/ferm.d/{{item}.j2 dest=/etc/ferm/ferm.d/{{item}.conf owner=根组=根模式=0640 时间:my_ferm_组中的项目 循环:{{group_names+'firewall_whitelist2'如果有效|地址|长度>0否则group_names} 但这一错误与

失败!=>{msg:在{{group_names+'firewall_whitelist2'上发生意外的模板类型错误,如果有效的{u addresses | length>0,否则group_names}:只能将list not\str\连接到list}` 你知道我该怎么做吗? 基本上,我试图找到一种方法,仅当条件与在我的允许的主机2中检测到的有效IP地址匹配时,才为防火墙生成该模板。 任何朝正确方向的轻推都会有所帮助。

下面的任务

-设定事实: 有效的\u地址:{{my\u allowed\u hosts2| json_查询“[].地址”| 映射“ipaddr”| 差异['127.0.0.1','::1/128']} -调试: var:有效的_地址 给予

有效地址:[ 202.167.24.50 ] 这可能就是你要找的回路吗

-调试: 变量:项目 循环:{{group_names}差异['firewall_whitelist2']} 什么时候: -my_ferm_组中的项目 -有效地址|长度>0 下面的任务

-设定事实: 有效的\u地址:{{my\u allowed\u hosts2| json_查询“[].地址”| 映射“ipaddr”| 差异['127.0.0.1','::1/128']} -调试: var:有效的_地址 给予

有效地址:[ 202.167.24.50 ] 这可能就是你要找的回路吗

-调试: 变量:项目 循环:{{group_names}差异['firewall_whitelist2']} 什么时候: -my_ferm_组中的项目 -有效地址|长度>0
让我觉得你是在尝试适应这个循环,什么时候应该在这个循环中

因此,最终您可能会在一个空数组上循环,而您也可以在一个填充的列表上循环并跳过所有项

当移动所有这些条件时,我们可以 总结:

-模板: src:/etc/ferm/ferm.d/{{item}}.j2 dest:/etc/ferm/ferm.d/{{item}}.conf 所有者:root 组:根 模式:0640 什么时候: -my_ferm_组中的项目 -物品!='防火墙白名单2'或有效地址|长度>0 循环:{{group_names}} 以下是这方面的两个例子:

当没有匹配的IP时 -主持人:全部 收集事实:不 任务: -调试: msg:{{item}} 什么时候: -my_ferm_组中的项目 -物品!='防火墙白名单2'或有效地址|长度>0 循环:{{group_names}} 变量: 有效地址:[] 组别名称: -防火墙\u白名单1 -防火墙\u白名单2 -防火墙\u白名单3 -防火墙\u白名单4 my_ferm_组: -防火墙\u白名单1 -防火墙\u白名单2 -防火墙\u白名单3 这是对以下内容的总结: 播放[全部]******************************************************************************************************* 任务[调试]***************************************************************************************************** 确定:[localhost]=>item=firewall\u whitelist1=>{ msg:firewall\u whitelist1 } 正在跳过:[localhost]=>item=firewall\u whitelist2 确定:[localhost]=>item=firewall\u whitelist3=>{ msg:firewall\u whitelist3 } 正在跳过:[localhost]=>item=firewall\u whitelist4 重演******************************************************************************************************* localhost:ok=1已更改=0无法访问=0失败=0跳过=0已获救=0已忽略=0 当存在任何匹配的IP时 -主持人:全部 收集事实:不 任务: -调试: msg:{{item}} 什么时候: -my_ferm_组中的项目 -物品!='防火墙白名单2'或有效地址|长度>0 循环:{{group_names}} 变量: 有效地址: - 10.1.1.1 组别名称: -防火墙\u白名单1 -防火墙\u白名单2 -防火墙\u白名单3 -防火墙\u白名单4 my_ferm_组: -防火墙\u白名单1 -防火墙\u白名单2 -防火墙\u白名单3 这是对以下内容的总结: 播放[全部]******************************************************************************************************* 任务[调试]***************************************************************************************************** 确定:[localhost]=>item=firewall\u whitelist1=>{ msg:firewall\u whitelist1 } 确定:[localhost]=>item=firewall\u whitelist2=>{ msg:firewall\u whitelist2 } 确定:[localhost]=>item=firewall\u whitelist3=>{ msg:firewall\u whitelist3 } 正在跳过:[localhost]=>item=firewall\u whitelist4 重演******************************************************************************************************* localhost:ok=1已更改=0无法访问=0失败=0跳过=0已获救=0已忽略=0
有了所有这些,您正在填充的有效\u地址保持现在的状态。

让我感觉您正在尝试适应循环中应该包含的内容

因此,最终您可能会在一个空数组上循环,而您也可以在一个填充的列表上循环并跳过所有项

在移动所有这些条件时,我们可能会得到:

-模板: src:/etc/ferm/ferm.d/{{item}}.j2 dest:/etc/ferm/ferm.d/{{item}}.conf 所有者:root 组:根 模式:0640 什么时候: -my_ferm_组中的项目 -物品!='防火墙白名单2'或有效地址|长度>0 循环:{{group_names}} 以下是这方面的两个例子:

当没有匹配的IP时 -主持人:全部 收集事实:不 任务: -调试: msg:{{item}} 什么时候: -my_ferm_组中的项目 -物品!='防火墙白名单2'或有效地址|长度>0 循环:{{group_names}} 变量: 有效地址:[] 组别名称: -防火墙\u白名单1 -防火墙\u白名单2 -防火墙\u白名单3 -防火墙\u白名单4 my_ferm_组: -防火墙\u白名单1 -防火墙\u白名单2 -防火墙\u白名单3 这是对以下内容的总结: 播放[全部]******************************************************************************************************* 任务[调试]***************************************************************************************************** 确定:[localhost]=>item=firewall\u whitelist1=>{ msg:firewall\u whitelist1 } 正在跳过:[localhost]=>item=firewall\u whitelist2 确定:[localhost]=>item=firewall\u whitelist3=>{ msg:firewall\u whitelist3 } 正在跳过:[localhost]=>item=firewall\u whitelist4 重演******************************************************************************************************* localhost:ok=1已更改=0无法访问=0失败=0已跳过=0 r escued=0忽略=0 当存在任何匹配的IP时 -主持人:全部 收集事实:不 任务: -调试: msg:{{item}} 什么时候: -my_ferm_组中的项目 -物品!='防火墙白名单2'或有效地址|长度>0 循环:{{group_names}} 变量: 有效地址: - 10.1.1.1 组别名称: -防火墙\u白名单1 -防火墙\u白名单2 -防火墙\u白名单3 -防火墙\u白名单4 my_ferm_组: -防火墙\u白名单1 -防火墙\u白名单2 -防火墙\u白名单3 这是对以下内容的总结: 播放[全部]******************************************************************************************************* 任务[调试]***************************************************************************************************** 确定:[localhost]=>item=firewall\u whitelist1=>{ msg:firewall\u whitelist1 } 确定:[localhost]=>item=firewall\u whitelist2=>{ msg:firewall\u whitelist2 } 确定:[localhost]=>item=firewall\u whitelist3=>{ msg:firewall\u whitelist3 } 正在跳过:[localhost]=>item=firewall\u whitelist4 重演******************************************************************************************************* localhost:ok=1已更改=0无法访问=0失败=0跳过=0已获救=0已忽略=0
在所有这些情况下,您正在填充的有效\u地址保持当前的状态。

在循环中,预期的结果是什么?通过使用debug简化循环。例如-debug:var:item。。。在循环中,预期的结果是什么?通过使用debug简化循环。例如-debug:var:item。。。来吧,谢谢弗拉基米尔!对不起,没有更好地解释。但我想你几乎得到了我想要的。我确实想循环查看组名称,但我想从列表中删除防火墙白名单2,以便在有效地址长度>0时不会复制模板。如果这个条件不满足,我仍然希望它在列表中迭代并复制其他文件,而不是firewall_whitelist2。我也更新了我的问题,希望能说明我的意思。当我使用您给出的循环作为上面的示例时,循环得到了迭代,但是即使满足了条件,在有效的\u地址中有一个有效的IP地址,它仍然不会复制防火墙\u白名单2的模板,即使它复制了其他模板……感谢Vladimir!对不起,没有更好地解释。但我想你几乎得到了我想要的。我确实想循环查看组名称,但我想从列表中删除防火墙白名单2,以便在有效地址长度>0时不会复制模板。如果这个条件不满足,我仍然希望它在列表中迭代并复制其他文件,而不是firewall_whitelist2。我也更新了我的问题,希望能说明我的意思。当我使用您给出的循环作为上面的示例时,循环会被迭代,但即使满足条件,在有效的\u地址中有一个有效的IP地址,它仍然不会复制防火墙\u白名单2的模板,即使它复制了其他模板。。。
fatal: [myhost]: FAILED! => {
   "msg": "the inline if-expression on line 1 evaluated to false and no else section was defined."
}