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)