Bagaimana cara memeriksa respons JSON dari permintaan uri dengan Ansible?

15

Saya memiliki tugas Ansible yang membuat permintaan URI ke situs web untuk mendapatkan respons JSON. Saya ingin Dapat melakukan sesuatu jika variabel JSON bersarang didefinisikan, dan sesuatu yang lain jika tidak.

- 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"

Perhatikan bahwa menggunakan ignore_errorshanya berfungsi untuk perintah tugas gagal, bukan untuk memeriksa nilai yang tidak ditentukan dalam struktur data bersarang dalam template Jinja. Jadi, jika json_response.json.nested1.nested2tidak didefinisikan, tugas ini masih akan gagal meskipun ignore_errors=yestelah ditetapkan.

Bagaimana caranya agar buku pedoman ini menyimpan beberapa nilai default /tmp/foo.txtjika permintaan gagal, atau jika permintaan tidak memiliki nilai bersarang yang ditentukan?

Neil
sumber

Jawaban:

20

Anda perlu menggunakan filter jinja2 ( http://docs.ansible.com/ansible/playbooks_filters.html ). Dalam hal ini, nama filter adalah from_json . Dalam contoh berikut ini saya akan mengambil tindakan ketika kunci ditemukan dan tindakan lain ketika tidak dapat ditemukan:

 ---                                                                                                            

 - 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    

Sekarang ganti debug untuk yang tepat untuk mengambil tindakan yang diinginkan.

Semoga ini bisa membantu,

alfredocambera
sumber
3

Saya tersandung di sini setelah mencari cara bagaimana mengekstrak bidang dari json dari api github. Saya berakhir dengan solusi berikut.

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

register: github_json

dan gunakan di tempat lain seperti ini:

"{{ github_json.json.$key }}"
Samy Coenen
sumber
1
Saya tidak yakin ini benar-benar membantu OP: Anda tidak benar-benar menjelaskan dari mana $ key berasal, dan pertanyaannya pada dasarnya adalah menanyakan apa yang terjadi ketika tidak ada $keybidang dalam respons - yaitu sesuatu yang defaultmungkin berguna untuk filter jinja .
iwaseatenbyagrue
1
Ini bukan respons langsung ke OP karena pertanyaannya sudah lebih dari satu setengah tahun, tetapi saya berharap itu bisa bermanfaat bagi orang-orang yang ingin mendapatkan nilai JSON dari API menggunakan hanya Ansible yang merupakan cara saya menemukan ini. halaman.
Samy Coenen