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?
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,
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 }}"
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