Ansible:包含带有JMESPath的字符串的筛选器元素

Ansible:包含带有JMESPath的字符串的筛选器元素,ansible,jmespath,json-query,Ansible,Jmespath,Json Query,我想获取已定义接口类型的地址列表。 我找到了一些信息 这是我的剧本: -名称:Test JMESPath 主机:本地主机 收集事实:不 变量: 接口: -名称:em0 地址:10.127.37.89/29 -姓名:bge0 地址:10.112.171.81/28 -姓名:bge1 地址:10.112.171.65/28 -姓名:bge2 地址:10.112.171.97/28 任务: -名称:JMESPath查询 设定事实: 结果:{接口| json_查询(查询)}” 变量: 查询:“[?名称.

我想获取已定义接口类型的地址列表。
我找到了一些信息

这是我的剧本:

-名称:Test JMESPath
主机:本地主机
收集事实:不
变量:
接口:
-名称:em0
地址:10.127.37.89/29
-姓名:bge0
地址:10.112.171.81/28
-姓名:bge1
地址:10.112.171.65/28
-姓名:bge2
地址:10.112.171.97/28
任务:
-名称:JMESPath查询
设定事实:
结果:{接口| json_查询(查询)}”
变量:
查询:“[?名称.包含(@,'bge')].地址”
-调试:
var:结果
我想得到:

[
"10.112.171.81/28",
"10.112.171.65/28",
"10.112.171.97/28"
]
它在JMESPath网站上运行,但我的剧本失败了:

ansible playbook play-testJMESPath.yml[警告]:提供的主机列表
为空,只有localhost可用。请注意,隐式
localhost与“all”不匹配
播放[测试JMESPath]
**************************************************************************************************************************************************************************************************
任务[JMESPath查询]
*************************************************************************************************************************************************************************************************致命:[localhost]:失败!=>{“msg”:“json_查询中的JMespatheror”
筛选器插件:\n函数包含(),值的类型无效:
外部,应为:['array','string']之一,收到:
\“未知\”“}
重演
************************************************************************************************************************************************************************************************************localhost:ok=0已更改=0无法访问=0
失败=1跳过=0解救=0忽略=0
有人能解释一下原因吗?

可以用。与仅“如果字符串包含提供的$search参数,则返回true”的工具相比,这使它们成为一个更强大的工具

下面的任务

-设置事实:
结果:“{{个接口|
选择属性('name','search','bge')|
映射(属性=“地址”)|
列表}”
-调试:
var:结果
给予

“结果”:[
"10.112.171.81/28",
"10.112.171.65/28",
"10.112.171.97/28"
]

对于您看到的JMESPath问题,这里解释如下:

问题与Ansible对字符串使用自己的类型有关:
AnsibleunNicode
AnsibleUnsafeText
。 只要jmespath库具有非常严格的类型检查,它就无法接受这些类型作为字符串文本

资料来源:


正如在同一期中所解释的,使其正常工作的技巧是使用
to_json | from_json
过滤器对,以强制返回正确的类型

因此,剧本:

-hosts:localhost
收集事实:不
任务:
-调试:
msg:{{接口|到|从| json | json |查询}}”
变量:
查询:“[?名称.包含(@,'bge')].地址”
接口:
-名称:em0
地址:10.127.37.89/29
-姓名:bge0
地址:10.112.171.81/28
-姓名:bge1
地址:10.112.171.65/28
-姓名:bge2
地址:10.112.171.97/28
给出了预期的:

任务[调试]*****************************************************************************************************
确定:[本地主机]=>{
“味精”:[
"10.112.171.81/28",
"10.112.171.65/28",
"10.112.171.97/28"
]
}
重演*******************************************************************************************************
localhost:ok=1已更改=0无法访问=0失败=0跳过=0已获救=0已忽略=0

good,您也可以使用selectattr的match属性:```{interfaces | selectattr('name','match','^bge')| map(attribute='address')| list}}``谢谢,这可能会派上用场