2017-08-30 1 views
0

J'interroge une API avec la commande command d'Ansible. L'API renvoie un objet JSON avec des informations réseau.Comment filtrer les données JSON dans Ansible?

J'aimerais obtenir l'adresse IP privée d'un serveur en fonction de son adresse IP publique. Je sais que c'est possible avec JSON query filter mais je ne peux pas comprendre comment.

Le code:

- name: Get RPN topology 
    command: 'curl -X GET -H "Authorization: Bearer {{ onlineApiToken }}" "https://api.online.net/api/v1/rpn/group"' 
    register: RPN 
    delegate_to: 127.0.0.1 

C'est ce que la sortie RPN.stdout ressemble:

TASK [debug] **************************************************************************************** 
ok: [ps1] => { 
    "changed": false, 
    "msg": [ 
     { 
      "id": 7406, 
      "members": [ 
       { 
        "id": 0000, 
        "ip": "x.x.x.x", 
        "owner": "buzut", 
        "private_ip": "10.91.154.39", 
        "speed": 100, 
        "status": "active" 
       }, 
       { 
        "id": 1111, 
        "ip": "y.y.y.y", 
        "owner": "buzut", 
        "private_ip": "10.91.120.148", 
        "speed": 100, 
        "status": "active" 
       }, 
       { 
        "id": 2222, 
        "ip": "z.z.z.z", 
        "owner": "buzut", 
        "private_ip": "10.91.165.215", 
        "speed": 1000, 
        "status": "active" 
       } 
      ], 
      "name": "MySQL", 
      "owner": "buzut", 
      "shared": false, 
      "status": "updating" 
     } 
    ] 
} 

La question: comment puis-je obtenir IP privée d'un serveur, en fonction de son public?

Répondre

0
--- 
- name: play1 
    hosts: localhost 
    gather_facts: false 
    vars: 
    public_ip: "x.x.x.x" 

    tasks: 

    - name: Print data 
    debug: var=RPN 

    - name: Lookup value in json var 
    debug: var=item 
    with_items: "{{RPN|json_query(public_to_private_ip)}}" 
    vars: 
     public_to_private_ip: "members[?ip=='{{ public_ip }}'].private_ip" 

Vous donne:

PLAY [play1] ******************************************************************* 

TASK [Print data] ************************************************************** 
ok: [localhost] => { 
    "RPN": { 
     "id": 7406, 
     "members": [ 
      { 
       "id": "0000", 
       "ip": "x.x.x.x", 
       "owner": "buzut", 
       "private_ip": "10.91.154.39", 
       "speed": 100, 
       "status": "active" 
      }, 
      { 
       "id": 1111, 
       "ip": "y.y.y.y", 
       "owner": "buzut", 
       "private_ip": "10.91.120.148", 
       "speed": 100, 
       "status": "active" 
      }, 
      { 
       "id": 2222, 
       "ip": "z.z.z.z", 
       "owner": "buzut", 
       "private_ip": "10.91.165.215", 
       "speed": 1000, 
       "status": "active" 
      } 
     ], 
     "name": "MySQL", 
     "owner": "buzut", 
     "shared": false, 
     "status": "updating" 
    } 
} 

TASK [Lookup value in json var] ************************************************ 
ok: [localhost] => (item=10.91.154.39) => { 
    "item": "10.91.154.39" 
} 

PLAY RECAP ********************************************************************* 
localhost     : ok=2 changed=0 unreachable=0 failed=0 

members[?ip=='{{ public_ip }}'].private_ip agit magiquement.

+0

Merci beaucoup pour votre réponse, mais cela ne fonctionne toujours pas :(Cela peut être parce que var 'RPN' contient des objets imbriqués: «RPN.stdout» comme indiqué dans la publication. J'ai essayé d'utiliser 'with_items:" {{RPN.stdout [0] ... 'à la place de ce que vous avez fourni, mais sans succès jusqu'ici. – Buzut

0

Vous voudrez probablement prendre le temps de lire le JMESPath Examples pour vous familiariser avec la syntaxe supportée par le filtre json_query. Ce qui suit vous donne le résultat que vous voulez:

- hosts: localhost 
    gather_facts: false 
    vars: 
    RPN: 
     stdout: >- 
     [ 
      { 
      "id": 7406, 
      "members": [ 
       { 
       "id": 0, 
       "ip": "x.x.x.x", 
       "owner": "buzut", 
       "private_ip": "10.91.154.39", 
       "speed": 100, 
       "status": "active" 
       }, 
       { 
       "id": 1111, 
       "ip": "y.y.y.y", 
       "owner": "buzut", 
       "private_ip": "10.91.120.148", 
       "speed": 100, 
       "status": "active" 
       }, 
       { 
       "id": 2222, 
       "ip": "z.z.z.z", 
       "owner": "buzut", 
       "private_ip": "10.91.165.215", 
       "speed": 1000, 
       "status": "active" 
       } 
      ], 
      "name": "MySQL", 
      "owner": "buzut", 
      "shared": false, 
      "status": "updating" 
      } 
     ] 

    tasks: 
    - name: lookup server based on public ip 
     debug: 
     var: item 
     with_items: "{{RPN.stdout|from_json|json_query(public_to_private_ip)}}" 
     vars: 
     public_to_private_ip: >- 
      [].members[?ip=='{{ public_ip }}'].private_ip 

Si j'appelle cela comme:

ansible-playbook playbook.yml -e public_ip=y.y.y.y 

Je reçois:

TASK [lookup server based on public ip] **************************************** 
ok: [localhost] => (item=10.91.120.148) => { 
    "item": "10.91.120.148" 
} 

Et si je l'appelle comme:

ansible-playbook playbook.yml -e public_ip=z.z.z.z 

Je reçois: