我通过调用从Ansible调用的python库获得以下字典。
{
"replication_detail": [
{
"name": "xxx.203.server:11111",
"self": true,
"state": 1,
"stateStr": "PRIMARY",
"syncSourceHost": "",
"syncingTo": ""
},
{
"name": "xxx.204.server:11111",
"state": 2,
"stateStr": "SECONDARY",
"syncSourceHost": "xxx.203,server:11111",
"syncingTo": "xxx.203,server:11111"
},
{
"name": "xxx.205,server:11111"
"state": 8,
"stateStr": "(not reachable/healthy)",
"syncSourceHost": "",
"syncingTo": ""
}
]
}
我希望有一个过滤器,该过滤器可以在[“ PRIMARY”,“ SECONDARY”]中查找另一个名为“ StateStr”的元素,并返回“ name”
我尝试了match或equalto,但是它们都只取一个值。还有其他可以查询多个搜索值的功能。
我正在尝试使用map而不是with_loop来获取数据。
类似的代码 “从replication_detail中选择名称,其中sateStr在(PRIMARY,SECONDARY)中”
replication_detail | statePri in((主要,次要))| map(attribute =“ name” | list
答案 0 :(得分:2)
您可以使用selectattr
过滤器来按属性过滤字典列表。例如,如果您问题中的数据包含在名为data
的变量中,则执行以下任务:
- debug:
msg: "name: {{ item }}"
loop: "{{ data.replication_detail|selectattr('stateStr', 'match', 'SECONDARY|PRIMARY')|map(attribute='name')|list }}"
将输出:
TASK [debug] **********************************************************************************************************************************************************************************
ok: [localhost] => (item=xxx.203.server:11111) => {
"msg": "name: xxx.203.server:11111"
}
ok: [localhost] => (item=xxx.204.server:11111) => {
"msg": "name: xxx.204.server:11111"
}
将输出: