首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >看似合理的攻略json_query

看似合理的攻略json_query
EN

Stack Overflow用户
提问于 2020-01-22 21:43:55
回答 3查看 304关注 0票数 1

在加载了以下Ansible本地事实之后:

代码语言:javascript
复制
    {
    "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"
        }
    }
}

我想在筛选器中使用它们,以便仅在cdbs.*.char_set == 'AL32UTF8‘上选择,但无法弄清楚如何在任务中添加筛选器条件:

代码语言:javascript
复制
- name: "Task1"
  vars:
    myquery : '[cdbs.*.char_set][0]'
  debug:
    msg:
      - "Query condition: {{ myquery }}"
      - "Query filter   : {{ ansible_local | json_query(myquery) }}"

除此之外,是否有可能获得项目的名称列表,即e01ca605等?

任何帮助都将不胜感激!

向您致敬,德克

EN

回答 3

Stack Overflow用户

发布于 2020-01-22 23:44:51

我(使用管道)得到了以下结果:

代码语言:javascript
复制
- name: "Task4"
  vars:
    myquery: cdbs.* | [?char_set=='AL32UTF8']
  debug:
    msg:
      - "{{ item }}"
  with_items: "{{ ansible_local | json_query(myquery)  }}"
票数 1
EN

Stack Overflow用户

发布于 2020-01-22 23:16:26

Q: Select cdbs.*.char_set == 'AL32UTF8‘

答:下面的任务

代码语言:javascript
复制
    - set_fact:
        sel_AL32UTF8: "{{ cdbs|json_query(myquery) }}"
      vars:
        myquery: "*|[?char_set=='AL32UTF8']"
    - debug:
        var: sel_AL32UTF8

代码语言:javascript
复制
   "sel_AL32UTF8": [
        {
            "char_set": "AL32UTF8", 
            "home": "/u01/dbhome_3", 
            "npdbs": "0", 
            "pdbs": ""
        }, 
        {
            "char_set": "AL32UTF8", 
            "home": "/u01/dbhome_1", 
            "npdbs": "1", 
            "pdbs": "pdb1"
        }, 
        {
            "char_set": "AL32UTF8", 
            "home": "/u01/dbhome_2", 
            "npdbs": "0", 
            "pdbs": ""
        }
    ]

Q:获取名称列表。

答:使用keys()方法。例如

代码语言:javascript
复制
    - set_fact:
        cdbs_keys: "{{ cdbs.keys()|list }}"
    - debug:
        var: cdbs_keys

代码语言:javascript
复制
    "cdbs_keys": [
        "e01ca900", 
        "e01ca602", 
        "e01ca603", 
        "e01ca601", 
        "e01ca604", 
        "e01ca605"
    ]
票数 0
EN

Stack Overflow用户

发布于 2020-01-23 17:58:30

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

代码语言:javascript
复制
    - name: "Task10"
  vars:
    myquery: "[?value.char_set=='AL32UTF8']"
  debug: var=item.key
  with_items: "{{ ansible_local.cdbs|dict2items|json_query(myquery) }}"

产生一个项目列表

代码语言:javascript
复制
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)

语法和可能性似乎非常强大,尽管很难调试;-)

谢谢你的帮忙!

干杯,德克

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59861117

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档