it-swarm.com.de

Wie überprüfe ich die JSON-Antwort von einer uri-Anfrage mit Ansible?

Ich habe eine Ansible-Aufgabe, die eine URI-Anfrage an eine Website sendet, um eine JSON-Antwort zu erhalten. Ich möchte, dass Ansible etwas unternimmt, wenn die verschachtelte JSON-Variable definiert ist, und etwas anderes, wenn dies nicht der Fall ist.

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

Beachten Sie, dass die Verwendung von ignore_errors Nur für den fehlgeschlagenen Befehl der Aufgabe funktioniert, nicht für die Überprüfung undefinierter Werte in verschachtelten Datenstrukturen innerhalb einer Jinja-Vorlage. Wenn also json_response.json.nested1.nested2 Nicht definiert ist, schlägt diese Aufgabe trotz der Einstellung von ignore_errors=yes Immer noch fehl.

Wie bringe ich dieses Playbook dazu, einen Standardwert in /tmp/foo.txt Zu speichern, wenn die Anforderung fehlschlägt oder wenn für die Anforderung nicht der richtige verschachtelte Wert definiert ist?

15
Neil

Sie müssen einen jinja2-Filter verwenden ( http://docs.ansible.com/ansible/playbooks_filters.html ). In diesem Fall lautet der Name des Filters from_json . Im folgenden Beispiel werde ich eine Aktion ausführen, wenn der Schlüssel gefunden wird, und eine andere Aktion, wenn der Schlüssel nicht gefunden werden konnte:

 ---                                                                                                            

 - 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    

Ersetzen Sie nun das Debugging durch das entsprechende, um die gewünschte Aktion auszuführen.

Ich hoffe es hilft,

20
alfredocambera

Ich stolperte hier, nachdem ich nach einer Möglichkeit gesucht hatte, ein Feld aus json aus der Github-API zu extrahieren. Am Ende hatte ich die folgende Lösung.

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

register: github_json

und benutze es woanders wie folgt:

"{{ github_json.json.$key }}"
3
Samy Coenen

Gemäß Dokumentation unter https://docs.ansible.com/ansible/latest/modules/uri_module.html

Gibt an, ob der Hauptteil der Antwort als "Inhalts" -Schlüssel im Wörterbuchergebnis zurückgegeben werden soll. Unabhängig von dieser Option wird der JSON immer in einen Schlüssel namens json in den Wörterbuchergebnissen geladen, wenn der gemeldete Inhaltstyp "application/json" ist.

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