2014-10-21 16 views
6

Dato questo inventario:ansible: sorta di comprensione della lista?

[webservers] 
10.0.0.51 private_ip='X.X.X.X' 
10.0.0.52 private_ip='Y.Y.Y.Y' 
10.0.0.53 private_ip='Z.Z.Z.Z' 

Come posso ottenere una lista degli IP privati ​​dei server web?

webservers_private_ips: "{{ }}" # ['X.X.X.X', 'Y.Y.Y.Y', 'Z.Z.Z.Z'] 

So groups['webservers'] mi darà questa lista ['10.0.0.51', '10.0.0.52', '10.0.0.53'] e posso ottenere la private_ip di quello con:

{{ hostvars[item]['private_ip'] }} 
with_items: groups['webservers'] 

Ma vorrei dichiarare una variabile nel mio file var direttamente e non hanno un compito di registrarlo. Sarebbe bello se qualcosa del genere potesse essere fatto:

webservers_private_ips: "{{ hostvars[item]['private_ip'] }} for item in groups['webservers']" 

risposta

-3

Dipende dal contesto. se si desidera loop oltre private_ip variabile in un compito, si può fare in questo modo:

- hosts: all 
    tasks: 
    - name: Print private_ips 
    debug: var={{ hostvars[item]['private_ip'] }} 
    with_items: 
     - "{{ groups['webservers'] }}" 

Si noti che questo stamperà gli IP per 3 volte, in quanto verrà eseguito su ciascun server, quindi a seconda di ciò che si Stai cercando di ottenere, dovrai impostare hosts: all sul tuo server di frontend o altro.

È anche possibile eseguire questa operazione in un file Jinja2 se si prevede di generare un file di configurazione. Di nuovo, tutto dipende da cosa stai mirando.

Si noti che è possibile accedere alle informazioni IP nei fatti raccolti automaticamente dal ansible:

$ ansible someserver -m setup 
    .... 
    "ansible_eth1": { 
     "active": true, 
     "device": "eth1", 
     "ipv4": { 
      "address": "192.168.252.6", 
      "netmask": "255.255.255.255", 
      "network": "192.168.252.6" 
     }, 
     "mtu": 1500, 
     "promisc": false 
    }, 
    .... 

che potrebbe anche essere più adatto, a seconda quello che stai cercando di fare.

Buona fortuna.

+0

Grazie. Sì, come ho detto, so come farlo in un compito e in un modello. Quello che sto cercando è di creare una variabile con l'elenco di IP privati ​​che posso passare in diversi ruoli, ad esempio. – Michael

+0

Puoi dirci di più sul tuo caso d'uso? Soprattutto, li userai in un modello? – leucos

+0

No, non deve essere utilizzato in un modello. Uno dei ruoli che uso si aspetta una lista di indirizzi IP come variabile. Potrei creare questa lista manualmente nel mio file di vars, ma mi piacerebbe creare questa variabile dinamicamente dalle variabili private_ip che ho definito su ciascun host. – Michael

5

Si può approfittare della 'extract' filter per ottenere i componenti di un oggetto di dati composito:

webservers_private_ips: "{{ groups['webservers']|map('extract', hostvars, 'private_ip')|list }}" 
+1

è grandioso, ma l'ansible 2.1 non è ancora uscito – alkar

Problemi correlati