【问题标题】:Ansible playbook json_queryAnsible 剧本 json_query
【发布时间】:2020-05-08 16:41:45
【问题描述】:

加载以下 Ansible 本地事实后:

    {
    "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',但无法弄清楚如何在任务中添加过滤条件:

- name: "Task1"
  vars:
    myquery : '[cdbs.*.char_set][0]'
  debug:
    msg:
      - "Query condition: {{ myquery }}"
      - "Query filter   : {{ ansible_local | json_query(myquery) }}"

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

任何帮助将不胜感激!

问候,德克

【问题讨论】:

    标签: ansible json-query


    【解决方案1】:

    我得到了这个(使用管道)工作:

    - name: "Task4"
      vars:
        myquery: cdbs.* | [?char_set=='AL32UTF8']
      debug:
        msg:
          - "{{ item }}"
      with_items: "{{ ansible_local | json_query(myquery)  }}"
    

    【讨论】:

      【解决方案2】:

      问:选择 cdbs.*.char_set == 'AL32UTF8'

      A:下面的任务

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

         "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": ""
              }
          ]
      

      问:获取名称列表。

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

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

          "cdbs_keys": [
              "e01ca900", 
              "e01ca602", 
              "e01ca603", 
              "e01ca601", 
              "e01ca604", 
              "e01ca605"
          ]
      

      【讨论】:

      • 你好弗拉基米尔,你提出的任务工作得很好!与此同时,我也得到了这个(使用管道)工作:-名称:“Task4”vars:myquery:cdbs。* | [?char_set=='AL32UTF8'] debug: msg: - "{{ item }}" with_items: "{{ ansible_local | json_query(myquery) }}" 但是,是否可以获得项目名称列表,即e01ca605等?干杯,德克
      • 你好,德克。当然,我已经更新了答案。干杯,弗拉基米尔。
      • 你好弗拉基米尔,谢谢这也很好。这个想法是将这两者结合起来:获取过滤条件的键列表。你也有解决方案吗?谢谢和欢呼,德克
      • 在答案部分添加了此问题的解决方案
      【解决方案3】:

      最后,结合弗拉基米尔的回复找到的解决方案是:

          - 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)
      

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

      感谢您的帮助!

      干杯,德克

      【讨论】:

        猜你喜欢
        • 2022-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-10
        • 2022-10-24
        • 1970-01-01
        相关资源
        最近更新 更多