Jak sprawdzić odpowiedź JSON z żądania URI za pomocą Ansible?

15

Mam zadanie Ansible, które wysyła żądanie URI do strony internetowej w celu uzyskania odpowiedzi JSON. Chcę, aby Ansible zrobił coś, jeśli zdefiniowano zagnieżdżoną zmienną JSON, i coś innego, jeśli tak nie jest.

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

Zauważ, że użycie ignore_errorsdziała tylko w przypadku niepowodzenia polecenia zadania, a nie do sprawdzania niezdefiniowanych wartości w zagnieżdżonych strukturach danych w szablonie Jinja. Jeśli więc json_response.json.nested1.nested2nie zostanie zdefiniowane, to zadanie nadal nie powiedzie się, mimo że ignore_errors=yeszostało ustawione.

Jak sprawić, aby ten podręcznik zawierał pewną wartość domyślną, /tmp/foo.txtjeśli żądanie zakończy się niepowodzeniem lub jeśli w żądaniu nie zdefiniowano właściwej wartości zagnieżdżonej?

Neil
źródło

Odpowiedzi:

20

Musisz użyć filtru jinja2 ( http://docs.ansible.com/ansible/playbooks_filters.html ). W tym przypadku nazwa filtra to from_json . W poniższym przykładzie wykonam akcję po znalezieniu klucza i inną akcję, gdy nie będzie można znaleźć:

 ---                                                                                                            

 - 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    

Teraz zastąp debugowanie odpowiednim, aby podjąć pożądaną akcję.

Mam nadzieję, że to pomoże,

alfredocambera
źródło
3

Natknąłem się tutaj, szukając sposobu na wydobycie pola z Jsona z Github API. Skończyło się na następującym rozwiązaniu.

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

register: github_json

i użyj go w innym miejscu:

"{{ github_json.json.$key }}"
Samy Coenen
źródło
1
Nie jestem pewien, czy to w rzeczywistości pomaga OP: tak naprawdę nie wyjaśniasz, skąd pochodzi $ key, a pytanie polega w zasadzie na pytaniu, co się stanie, gdy nie będzie $keypola w odpowiedzi - tj. Coś, co defaultmoże być przydatny w filtrze jinja .
iwaseatenbyagrue 10.04.17
1
To nie była bezpośrednia odpowiedź na OP, ponieważ pytanie ma ponad półtora roku, ale miałem nadzieję, że może być pomocny dla osób, które chciałyby uzyskać wartości JSON z API przy użyciu tylko Ansible, i tak natknąłem się na to strona.
Samy Coenen,