J'ai un appel de service qui renvoie l'état du système au format json
. Je souhaite utiliser le module ansible URI pour effectuer l'appel, puis inspecter la réponse pour décider si le système est actif ou non.
{"id":"20161024140306","version":"5.6.1","status":"UP"}
Ce serait le json
qui est retourné
C'est la tâche ansible qui fait un appel:
- name: check sonar web is up
uri:
url: http://sonarhost:9000/sonar/api/system/status
method: GET
return_content: yes
status_code: 200
body_format: json
register: data
La question est de savoir comment puis-je accéder à data
et l'inspecter selon la documentation ansible, c'est ainsi que nous stockons les résultats d'un appel. Je ne suis pas sûr de la dernière étape qui consiste à vérifier l'état.
Cela fonctionne pour moi.
- name: check sonar web is up
uri:
url: http://sonarhost:9000/sonar/api/system/status
method: GET
return_content: yes
status_code: 200
body_format: json
register: result
until: result.json.status == "UP"
retries: 10
delay: 30
Notez que result
est un dictionnaire ansible et lorsque vous définissez return_content=yes
la réponse est ajoutée à ce dictionnaire et est accessible à l'aide de la touche json
Assurez-vous également que vous avez correctement mis en retrait la tâche comme indiqué ci-dessus.
Vous avez fait le bon premier pas en enregistrant la sortie dans une variable.
L'étape suivante consiste à utiliser soit when:
ou failed_when:
dans votre prochaine tâche, qui basculera ensuite en fonction du contenu de la variable. Il existe un ensemble puissant d'instructions à utiliser dans celles-ci, les filtres intégrés Jinja2 , mais elles ne sont pas vraiment bien liées dans la documentation Ansible, ou bien résumées.
J'utilise des variables de sortie super explicitement nommées, donc elles ont du sens pour moi plus tard dans le playbook :) J'écrirais probablement le vôtre quelque chose comme:
- name: check sonar web is up
uri:
url: http://sonarhost:9000/sonar/api/system/status
method: GET
return_content: yes
status_code: 200
body_format: json
register: sonar_web_api_status_output
- name: do this thing if it is NOT up
Shell: echo "OMG it's not working!"
when: sonar_web_api_status_output.stdout.find('UP') == -1
Autrement dit, le texte "UP" ne se trouve pas dans la sortie standard de la variable.
Autres filtres intégrés Jinja2 que j'ai utilisés sont:
changed_when: "'<some text>' not in your_variable_name.stderr"
when: some_number_of_files_changed.stdout|int > 0
La page de documentation "Conditionnelles" d'Ansible contient certaines de ces informations. Ce billet de blog était également très instructif.
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