web-dev-qa-db-fra.com

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

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 de ignore_errors ne 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 json_response.json.nested1.nested2 n'est pas défini, cette tâche échouera malgré ignore_errors=yes en cours de définition.

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

15
Neil

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,

20
alfredocambera

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 }}"
3
Samy Coenen

Selon la documentation sur https://docs.ansible.com/ansible/latest/modules/uri_module.html

Indique s'il faut renvoyer ou non le corps de la réponse en tant que clé de "contenu" dans le résultat du dictionnaire. Indépendamment de cette option, si le type de contenu signalé est "application/json", le JSON est toujours chargé dans une clé appelée json dans les résultats du dictionnaire.

---
- name: Example of JSON body parsing with uri module
  connection: local
  gather_facts: true
  hosts: localhost
  tasks:

    - name: Example of JSON body parsing with uri module
      uri: 
        url: https://jsonplaceholder.typicode.com/users
        method: GET
        return_content: yes
        status_code: 200
        body_format: json
      register: data
      # failed_when: <optional condition based on JSON returned content>

    - name: Print returned json dictionary
      debug:
        var: data.json

    - name: Print certain element
      debug:
        var: data.json[0].address.city
0
Boeboe