web-dev-qa-db-fra.com

Comment inspecter une réponse json à partir d'un appel URI Ansible

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.

7
Hafiz

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.

21
Hafiz

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.

6
ocean

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