2017-06-08 2 views
0

J'ai un réseau avec différents hôtes et différents réseaux et je veux utiliser ansible pour ping chaque hôte dans chaque réseau.obtenir des éléments enfants d'un dictonairy

Dans mon répertoire host_vars, toutes les informations sur chaque hôte et son réseau sont stockées dans son propre fichier. Un fichier hôte ressemble à ceci:

bond: 
    - conn_name: net1 
    ip4: '10.10.44.21' 
    gw4: '10.10.44.1' 
    - conn_name: net2 
    ip4: '10.10.47.21' 
    gw4: '10.10.47.1' 
    - conn_name: net3 
    ip4: '10.10.46.21' 
    gw4: '10.10.46.1' 
bond_slave: 
    - conn_name: eno1 
    ifname: eno1 
    master: net1 
    - conn_name: eno2 
    ifname: eno2 
    master: net2 
    - conn_name: ens2f1 
    ifname: ens2f1 
    master: net2 
    - conn_name: ens2f0 
    ifname: ens2f0 
    master: net2 
    - conn_name: ens4f1 
    ifname: ens4f1 
    master: net3 
    - conn_name: ens4f0 
    ifname: ens4f0 
    master: net3 

Mon but est d'obtenir toutes les valeurs ip4 et de les envoyer à chaque hôte. ce que je peux faire est d'inclure tous les fichiers du répertoire host_vars et de faire un ping sur l'adresse ip du premier élément de liaison de chaque fichier.

--- 
- hosts: all 

- name: Include information about all hosts 
    include_vars: ../../host_vars/{{ item }}.yaml 
    with_items: hosts 
    register: "r" 

- name: execute ping 
    command: ping {{ bond[0].ip4 }} -c 3 
    with_items: "{{ r.results }}" 

Mais le lien peut avoir de 2 à 4 réseaux. Comment puis-je faire une boucle sur chaque lien pour accéder à toutes les adresses IP?

Solution

Même si l'extrait de Konstantin Suvorov ne fonctionnait pas pour moi, il m'a aidé à trouver la bonne solution:

- name: execute ping 
    command: ping {{ item.ip4 }} -c 3 
    with_items: "{{ r.results | map(attribute='ansible_facts.bond') | list }}" 

Répondre

0

Si vous avez bond var défini pour chaque hôte via host_vars, vous pouvez utiliser la variable hostvars magique (pas besoin de le faire laid comprennent tâche):

- name: ping everything 
    command: ping {{ item }} -c 3 
    with_items: "{{ play_hosts | map('extract',hostvars,'bond') | list }}" 

En fait cette expression Jinja2 retournera une liste de listes, mais with_items les flattends, ainsi vous vous retrouverez avec une longue liste de tous les éléments de chaque lien de chaque hôte dans le jeu en cours.

+0

merci pour votre aide. cela m'a aidé à trouver la syntaxe correcte pour l'exécution du ping. – JustOneQuestion