Как проверить ответ JSON от URI-запроса с Ansible?

15

У меня есть задача 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если запрос не выполнен или если в запросе не определено правильное вложенное значение?

Нил
источник

Ответы:

20

Вам необходимо использовать фильтр 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    

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

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

alfredocambera
источник
3

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

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

register: github_json

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

"{{ github_json.json.$key }}"
Сами Коенен
источник
1
Я не уверен, что это на самом деле помогает операционному оператору: вы на самом деле не объясняете, откуда взялся ключ $, и вопрос состоит в том, чтобы спросить, что происходит, когда $keyв ответе нет поля - т.е. что-то, для чего defaultможет пригодиться фильтр jinja.
iwaseatenbyagrue
1
Это не был прямой ответ на OP, так как вопросу уже более полутора лет, но я надеялся, что он может быть полезен для людей, которые хотят получать значения JSON из API, используя только Ansible, как я и наткнулся на это стр.
Сами Коенен