Назад | Перейти на главную страницу

Как проверить ответ JSON на запрос uri с помощью Ansible?

У меня есть задача Ansible, которая делает запрос URI на веб-сайт, чтобы получить ответ JSON. Я хочу, чтобы Ansible что-то делал, если вложенная переменная JSON определена, и что-то еще, если это не так.

- name: Get JSON from the Interwebs
  uri: url="http://whatever.com/jsonresponse" return_content=yes
  register: json_response

- name: Write nested JSON variable to disk
  copy: content={{json_response.json.nested1.nested2}} dest="/tmp/foo.txt"

Обратите внимание, что использование ignore_errors работает только при сбое команды задачи, а не для проверки неопределенных значений во вложенных структурах данных в шаблоне Jinja. Так что если json_response.json.nested1.nested2 не определен, эта задача все равно не удастся, несмотря на ignore_errors=yes устанавливается.

Как мне заставить эту пьесу хранить какое-то значение по умолчанию в /tmp/foo.txt если запрос не выполняется или в запросе не определено правильное вложенное значение?

Вам нужно использовать фильтр jinja2 (http://docs.ansible.com/ansible/playbooks_filters.html). В этом случае имя фильтра from_json. В следующем примере я предприму действие, когда ключ будет найден, и другое действие, когда его не удалось найти:

 ---                                                                                                            

 - hosts: somehost                                                                                               
   sudo: yes                                                                                                    

   tasks:                                                                                                       

   - name: Get JSON from the Interwebs                                                                          
     uri: url="https://raw.githubusercontent.com/ljharb/node-json-file/master/package.json" return_content=yes  
     register: json_response                                                                                    

   - debug: msg="Error - undefined tag"                                                                         
     when: json_response["non_existent_tag"] is not defined                                                     

   - debug: msg="Success - tag defined =>{{  (json_response.content|from_json)['scripts']['test'] }}<="  
     when:  (json_response.content|from_json)['scripts']['test']  is defined    

Теперь замените отладку на соответствующую, чтобы выполнить желаемое действие.

Надеюсь, поможет,

Я наткнулся здесь, когда искал способ извлечь поле из json из github api. В итоге я получил следующее решение.

uri: url="https://api.github.com/repos/.../.../releases/latest" return_contents=yes

register: github_json

и используйте его где-нибудь еще вот так:

"{{ github_json.json.$key }}"

Согласно документации на https://docs.ansible.com/ansible/latest/modules/uri_module.html

Следует ли возвращать тело ответа как ключ «содержимого» в результате словаря. Независимо от этой опции, если сообщаемый Content-type - это «application / json», то JSON всегда загружается в ключ с именем json в результатах словаря.

---
- name: Example of JSON body parsing with uri module
  connection: local
  gather_facts: true
  hosts: localhost
  tasks:

    - name: Example of JSON body parsing with uri module
      uri: 
        url: https://jsonplaceholder.typicode.com/users
        method: GET
        return_content: yes
        status_code: 200
        body_format: json
      register: data
      # failed_when: <optional condition based on JSON returned content>

    - name: Print returned json dictionary
      debug:
        var: data.json

    - name: Print certain element
      debug:
        var: data.json[0].address.city