Comment vérifier la réponse JSON d'une demande d'URI avec Ansible?

15

J'ai une tâche Ansible qui fait une demande d'URI à un site Web pour obtenir une réponse JSON. Je veux qu'Ansible fasse quelque chose si la variable JSON imbriquée est définie, et autre chose si ce n'est pas le cas.

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

Notez que l'utilisation ignore_errorsne fonctionne que pour l'échec de la commande de la tâche, pas pour vérifier les valeurs non définies dans les structures de données imbriquées dans un modèle Jinja. Donc, si elle json_response.json.nested1.nested2n'est pas définie, cette tâche échouera malgré ignore_errors=yessa définition.

Comment puis-je obtenir ce playbook pour stocker une valeur par défaut /tmp/foo.txtsi la demande échoue ou si la demande n'a pas la bonne valeur imbriquée définie?

Neil
la source

Réponses:

20

Vous devez utiliser un filtre jinja2 ( http://docs.ansible.com/ansible/playbooks_filters.html ). Dans ce cas, le nom du filtre est from_json . Dans l'exemple suivant, je prendrai une action lorsque la clé est trouvée et une autre action lorsque la clé est introuvable:

 ---                                                                                                            

 - 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    

Remplacez maintenant le débogage pour que l'action appropriée soit prise.

J'espère que cela aide,

Alfredocambera
la source
3

Je suis tombé ici après avoir cherché un moyen d'extraire un champ de json de l'api github. Je me suis retrouvé avec la solution suivante.

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

register: github_json

et l'utiliser ailleurs comme ceci:

"{{ github_json.json.$key }}"
Samy Coenen
la source
1
Je ne suis pas sûr que cela aide réellement l'OP: vous n'expliquez pas vraiment d'où vient la clé $, et la question est essentiellement de savoir ce qui se passe quand il n'y a pas de $keychamp dans la réponse - c'est-à-dire quelque chose pour lequel le defaultfiltre de jinja pourrait être utile.
iwaseatenbyagrue
1
Ce n'était pas une réponse directe à l'OP car la question a plus d'un an et demi, mais j'espérais que cela pourrait être utile pour les personnes qui voulaient obtenir des valeurs JSON à partir d'une API en utilisant uniquement Ansible, c'est ainsi que je suis tombé sur ce sujet page.
Samy Coenen