Come controllare la risposta JSON da una richiesta uri con Ansible?


15

Ho un'attività Ansible che effettua una richiesta URI a un sito Web per ottenere una risposta JSON. Voglio che Ansible faccia qualcosa se viene definita la variabile JSON nidificata e qualcos'altro se non lo è.

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

Si noti che l'utilizzo ignore_errorsfunziona solo per il comando non riuscito del comando, non per il controllo di valori indefiniti in strutture di dati nidificate all'interno di un modello Jinja. Quindi, se json_response.json.nested1.nested2non è definito, questa attività fallirà comunque nonostante ignore_errors=yessia impostata.

Come posso ottenere questo playbook per memorizzare un valore predefinito /tmp/foo.txtse la richiesta fallisce o se la richiesta non ha il valore nidificato definito?

Risposte:


20

Devi usare un filtro jinja2 ( http://docs.ansible.com/ansible/playbooks_filters.html ). In questo caso, il nome del filtro è from_json . Nell'esempio seguente eseguirò un'azione quando viene trovata la chiave e altre azioni quando non è stato possibile trovare:

 ---                                                                                                            

 - 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    

Ora sostituisci il debug con l'appropriato per eseguire l'azione desiderata.

Spero che sia d'aiuto,


3

Mi sono imbattuto qui dopo aver cercato un modo su come estrarre un campo da JSON dall'API Github. Ho finito con la seguente soluzione.

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

register: github_json

e usalo da qualche altra parte in questo modo:

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

1
Non sono sicuro che questo aiuti effettivamente l'OP: non spieghi davvero da dove proviene $ key, e la domanda è fondamentalmente la domanda su cosa succede quando non c'è un $keycampo nella risposta - cioè qualcosa per cui defaultpotrebbe essere utile il filtro di jinja .
Iwaseatenbyagrue,

1
Questa non è stata una risposta diretta all'OP poiché la domanda ha più di un anno e mezzo, ma speravo potesse essere utile per le persone che volevano ottenere valori JSON da un'API usando solo Ansible, ed è così che mi sono imbattuto in questo pagina.
Samy Coenen,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.