Как выполнить цикл в Ansible по результату регистрации и выбрать конкретный узел?

#ansible

#ансибль

Вопрос:

я регистрирую результат определенного SQL — запроса:

 - name: Output Result  debug:  var: result.query_result[0]  

Я получаю длинный список, который выглядит так:

 {  "result": {  "changed": true,  "failed": false,  "query_result": [  [  {  "C": "",  "CHID": "",  "DESCRIPTION": "",  "EXPECTED_VALUE": "",  "HOST": "",  "SAP_NOTE": "",  "VALUE": ""  },  {  "C": "",  "CHID": "M0005",  "DESCRIPTION": "Generated with",  "EXPECTED_VALUE": "",  "HOST": "",  "SAP_NOTE": "1969700",  "VALUE": "SQL: \HANA_Configuration_MiniChecks\"""  }  ]  ],  "rc": 0,  "stderr": "",  "stderr_lines": []  } }  

Как я могу вывести только эту часть, если он существует:

 {  "C": "",  "CHID": "M0005",  "DESCRIPTION": "Generated with",  "EXPECTED_VALUE": "",  "HOST": "",  "SAP_NOTE": "1969700",  "VALUE": "SQL: \HANA_Configuration_MiniChecks\"""  }  

Расположение вышеупомянутого узла может измениться, поэтому я не могу специально нацелиться на него.

Комментарии:

1. это query_result список, он будет содержать только эти 2 пункта, но порядок может измениться? будет лучше, если вы объясните, как отфильтровать нужную строку/элемент из списка

2. Привет @ilias-sp, если [«CHID»: «M0005»] существует, чем показывать.

3. спасибо за разъяснение, я опубликовал ответ

Ответ №1:

вы можете использовать json_query для фильтрации элемента, имеющего ключ/значение: "CHID": "M0005"

полный пример учебника для демонстрации:

 --- - hosts: localhost  gather_facts: false  vars:  query_result:  - C: ''  CHID: ''  DESCRIPTION: ''  EXPECTED_VALUE: ''  HOST: ''  SAP_NOTE: ''  VALUE: ''  - C: ''  CHID: M0005  DESCRIPTION: Generated with  EXPECTED_VALUE: ''  HOST: ''  SAP_NOTE: '1969700'  VALUE: 'SQL: HANA_Configuration_MiniChecks""'  - C: ''  CHID: 22M00051231  DESCRIPTION: Generated with2121  EXPECTED_VALUE: ''  HOST: ''  SAP_NOTE: '1969700444'  VALUE: '444SQL: HANA_Configuration_MiniChecks""'   tasks:  - set_fact:   filtered_item: "{{ query_result | json_query('[?CHID == `M0005`]') }}"   - debug:  var: filtered_item  

в вашем случае json_query должен выглядеть так:

 - set_fact:   filtered_item: "{{ result.query_result | json_query('[?CHID == `M0005`]') }}"  

Пожалуйста, обратите внимание, что если в списке может быть несколько элементов, соответствующих условию, все они будут добавлены в список filtered_item . Чтобы убедиться, что вы получите только первое, вы можете передать результат в first :

 - set_fact:   filtered_item: "{{ query_result | json_query('[?CHID == `M0005`]') | first }}"  

Комментарии:

1. это работает 🙂 большое спасибо за вашу быструю поддержку.

2. рад, что это помогло! @AndrewRamnikov