Як перевірити відповідь JSON на запит урі з Ansible?


15

У мене є відповідне завдання, яке робить запит 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 ). У цьому випадку ім'я фільтра - від_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    

Тепер замініть налагодження на відповідний, щоб здійснити бажані дії.

Сподіваюся, це допоможе,


3

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

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
Це не було прямою відповіддю на ОП, оскільки це питання вже більше півтора років, але я сподівався, що це може бути корисним для людей, які хочуть отримати значення JSON від API, використовуючи лише Ansible, і саме тому я натрапив на це сторінки.
Samy Coenen
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.