ANSIBLE - Json_Query - Фильтровать результат - PullRequest
1 голос
/ 08 октября 2019

В моей сборной плейбуке я пытаюсь отфильтровать результат json, но пока он не работает.

1 / Playbook
Ниже моегоansible playbook для запроса и фильтрации результата:


tasks:
    - name: "Query Attributes" 
          ...
          ...
      register: query_result

    - name: Display Result
      debug: 
        var: query_result  

    - name: Display Filtered Result
      debug:
        msg: "{{ query_result.current| json_query('[].context.attributes[?name==`prod`].name') }}" 

Может быть, проблема внутри моего фильтра json_query?
Есть идеи?


2 / вывод Query_result перед фильтрацией

TASK [Display Result] ***************************************************
"query_result": {
                    "ansible_facts": {
                        "discovered_interpreter_python": "/usr/bin/python"
                    }, 
                    "changed": false, 
                    "current": [
                        {
                            "context": {
                                "attributes": {
                                    "name": "prod", 
                                    "uid": "11756"
                                }
                            }
                        }, 
                        {
....
                                }
                            }
                        }, 
                        {
                            "context": {
                                "attributes": {
                                    "name": "dev", 
                                    "uid": "14424"
                                }
                            }
                        }
                    ], 
                    "failed": false
                }
            }

*****************************      

3 / Отфильтрованный результат пуст
К сожалению, мой результат пуст,

    TASK [Display Filtered Result] **********************************************************    
{    
                "msg": []    
            }    

Спасибо
Джу

1 Ответ

0 голосов
/ 08 октября 2019

Прежде всего, одинарные и двойные кавычки имеют значение в выражениях jmespath . Ваша буквенная строка для поиска должна быть заключена в одинарные кавычки.

Во-вторых, ваш фильтр не будет соответствовать. Вы должны либо переместить свой фильтр на более высокий уровень при обработке потока, либо направить свое выражение.

Ниже приведены некоторые примеры, которые иллюстрируют приведенные выше рекомендации и приводят к тому же результату

---
- name: Filter with jmespath
  hosts: localhost
  gather_facts: false

  vars:
    query_result: {
      "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
      },
      "changed": false,
      "current": [
         {
           "context": {
             "attributes": {
               "name": "prod",
               "uid": "11756"
             }
           }
         },
         {
           "context": {
             "attributes": {
               "name": "dev",
               "uid": "14424"
             }
           }
         }
      ],
      "failed": false
    }

  tasks:

    - name: Display original result
      debug: var=query_result

    - name: Display Filtered Result - One expression - one liner
      debug:
        msg: "{{ query_result.current | json_query(\"[?context.attributes.name=='prod'].context.attributes.name[]\") }}"

    - name: Display Filtered Result - One expression - Query in block var
      vars:
        query: >-
          [?context.attributes.name=='prod'].context.attributes.name[]
      debug:
        msg: "{{ query_result.current | json_query(query) }}"

    - name: Display Filtered Result - Pipe expressions - Query in block var
      vars:
        query: >-
          [].context.attributes[] | [?name=='prod'].name[]
      debug:
        msg: "{{ query_result.current | json_query(query) }}"

Для вашего следующего вопроса, пожалуйста, прочитайте раздел справки и рассмотрите возможность предоставления полной MVCE непосредственно в вашем вопросе (как я только что сделал в этом ответе).

...