Ansible playbook json_查询

Ansible playbook json_查询,ansible,json-query,Ansible,Json Query,在加载以下可接受的本地事实后: { "cdbs": { "e01ca601": { "char_set": "AL32UTF8", "home": "/u01/dbhome_1", "npdbs": "1", "pdbs": "pdb1" }, "e01ca602": { "char_set": "WE8ISO88

在加载以下可接受的本地事实后:

    {
    "cdbs": {
        "e01ca601": {
            "char_set": "AL32UTF8",
            "home": "/u01/dbhome_1",
            "npdbs": "1",
            "pdbs": "pdb1"
        },
        "e01ca602": {
            "char_set": "WE8ISO8859P1",
            "home": "/u01/dbhome_2",
            "npdbs": "0",
            "pdbs": ""
        },
        "e01ca603": {
            "char_set": "AL32UTF8",
            "home": "/u01/dbhome_3",
            "npdbs": "0",
            "pdbs": ""
        },
        "e01ca604": {
            "char_set": "WE8ISO8859P1",
            "home": "/u01/dbhome_1",
            "npdbs": "0",
            "pdbs": ""
        },
        "e01ca605": {
            "char_set": "AL32UTF8",
            "home": "/u01/dbhome_2",
            "npdbs": "0",
            "pdbs": ""
        },
        "e01ca900": {
            "char_set": "WE8ISO8859P1",
            "home": "/u01/dbhome_3",
            "npdbs": "1",
            "pdbs": "pdb2"
        }
    },
    "pdbs": {
        "pdb1": {
            "cdb": "e01ca601",
            "creation_time": "2020-01-21 14:10:39"
        },
        "pdb2": {
            "cdb": "e01ca900",
            "creation_time": "2020-01-13 13:34:21"
        }
    }
}
我想在筛选器中使用它们,以便仅在CDB上进行选择。*.char_set=='AL32UTF8',但我无法确定如何在任务中添加筛选器条件:

- name: "Task1"
  vars:
    myquery : '[cdbs.*.char_set][0]'
  debug:
    msg:
      - "Query condition: {{ myquery }}"
      - "Query filter   : {{ ansible_local | json_query(myquery) }}"
除此之外,是否有可能获得项目名称列表,即e01ca605等

任何帮助都将不胜感激

你好,德克

Q:选择CDB.*.char\u set==“AL32UTF8”

A:下面的任务是什么

    - set_fact:
        sel_AL32UTF8: "{{ cdbs|json_query(myquery) }}"
      vars:
        myquery: "*|[?char_set=='AL32UTF8']"
    - debug:
        var: sel_AL32UTF8
给予


问:获取一份名单

答:应用
keys()
方法。比如说

    - set_fact:
        cdbs_keys: "{{ cdbs.keys()|list }}"
    - debug:
        var: cdbs_keys
给予

我用一根管子做了这个:


最后,结合Vladimir的回答,找到的解决方案是:

    - name: "Task10"
  vars:
    myquery: "[?value.char_set=='AL32UTF8']"
  debug: var=item.key
  with_items: "{{ ansible_local.cdbs|dict2items|json_query(myquery) }}"
产生一个项目列表

ok: [exa101vm01] => (item={'key': u'e01ca900', 'value': {u'home': u'/u01/dbhome_1', u'npdbs': u'1', u'char_set': u'AL32UTF8', u'pdbs': u'pdb1', u'archivelog_mode': u'NOARCHIVELOG'}}) => {
"ansible_loop_var": "item",
"item": {
    "key": "e01ca900",
    "value": {
        "archivelog_mode": "NOARCHIVELOG",
        "char_set": "AL32UTF8",
        "home": "/u01/dbhome_1",
        "npdbs": "1",
        "pdbs": "pdb1"
    }
},
"item.key": "e01ca900"
} 
... (cut here)
语法和可能性似乎非常强大,但调试起来很困难;-)

谢谢你的帮助


干杯,德克

你好,弗拉基米尔,你提出的任务很好!同时,我还使用管道实现了这一点:-name:“Task4”vars:myquery:cdbs.*.[124;[?char_set=='AL32UTF8']debug:msg:-“{{item}”with_items:{{ansible_local{124; json_query(myquery)}”然而,是否有可能获得项目名称列表,即e01ca605等?干杯,迪尔凯洛·德克。当然,我已经更新了答案。干杯,弗拉基米尔。你好,弗拉基米尔,谢谢。这也很好用。其思想是将这两种方法结合起来:获取过滤器条件的键列表。你也有解决这个问题的办法吗?谢谢和干杯,在回答部分中直接给出了这个问题的答案
- name: "Task4"
  vars:
    myquery: cdbs.* | [?char_set=='AL32UTF8']
  debug:
    msg:
      - "{{ item }}"
  with_items: "{{ ansible_local | json_query(myquery)  }}"
    - name: "Task10"
  vars:
    myquery: "[?value.char_set=='AL32UTF8']"
  debug: var=item.key
  with_items: "{{ ansible_local.cdbs|dict2items|json_query(myquery) }}"
ok: [exa101vm01] => (item={'key': u'e01ca900', 'value': {u'home': u'/u01/dbhome_1', u'npdbs': u'1', u'char_set': u'AL32UTF8', u'pdbs': u'pdb1', u'archivelog_mode': u'NOARCHIVELOG'}}) => {
"ansible_loop_var": "item",
"item": {
    "key": "e01ca900",
    "value": {
        "archivelog_mode": "NOARCHIVELOG",
        "char_set": "AL32UTF8",
        "home": "/u01/dbhome_1",
        "npdbs": "1",
        "pdbs": "pdb1"
    }
},
"item.key": "e01ca900"
} 
... (cut here)