Ansible ile bir uri isteğinden JSON yanıtı nasıl kontrol edilir?


15

Bir JSON yanıtı almak için bir Web sitesine URI isteği yapan Ansible bir görevim var. Yuvalanmış JSON değişkeni tanımlanmışsa Ansible bir şey yapmak ve değilse başka bir şey yapmak istiyorum.

- 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_errorsJinja şablonu içindeki iç içe veri yapılarındaki tanımlanmamış değerleri kontrol etmek için değil, yalnızca görevin komutu başarısız olduğunda işe yaradığını unutmayın . Yani eğer json_response.json.nested1.nested2tanımlı değil, bu görevi yine rağmen başarısız olur ignore_errors=yesseti olma.

Bu oynatma kitabının /tmp/foo.txt, istek başarısız olursa veya isteğin doğru iç içe değeri tanımlanmamışsa bazı varsayılan değerleri depolamasını nasıl sağlayabilirim ?

Yanıtlar:


20

Bir jinja2 filtresi kullanmanız gerekir ( http://docs.ansible.com/ansible/playbooks_filters.html ). Bu durumda, filtrenin adı from_json şeklindedir . Aşağıdaki örnekte, anahtar bulunduğunda bir işlem ve bulunamadığında başka bir işlem yapacağım:

 ---                                                                                                            

 - 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    

Şimdi, istenen eylemi gerçekleştirmeye uygun olan hata ayıklamasını değiştirin.

Umarım yardımcı olur,


3

Github api'den json'dan nasıl bir alan çıkarılacağına dair bir yol aradıktan sonra burada tökezledim. Sonunda aşağıdaki çözümü buldum.

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

register: github_json

ve bunun gibi başka bir yerde kullanın:

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

1
Bunun gerçekten OP'ye yardımcı olduğundan emin değilim: $ anahtarının nereden geldiğini gerçekten açıklamıyorsunuz ve soru temelde $keyyanıtta alan olmadığında ne olduğunu soruyor - yani jinja'nın defaultfiltresi yararlı olabilir.
iwaseatenbyagrue

1
Sorunun bir buçuk yıldan daha eski olması nedeniyle bu OP'ye doğrudan bir yanıt değildi, ancak bunun üzerine tökezlediğim sadece Ansible kullanarak bir API'dan JSON değerleri almak isteyen insanlar için yararlı olabileceğini umuyordum. sayfa.
Samy Coenen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.