Ansible:从列表返回一个属性,并将过滤器应用于另一个属性

时间:2019-05-21 19:58:57

标签: ansible ansible-2.x ansible-facts

我通过调用从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

1 个答案:

答案 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"
}

将输出: