2014-10-21 14 views
6

Biorąc pod uwagę ten inwentarz:ansible: rodzaj zrozumienia list?

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

Jak mogę uzyskać listę prywatnych ips tych serwerach?

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

wiem groups['webservers'] da mi tę listę ['10.0.0.51', '10.0.0.52', '10.0.0.53'] i mogę dostać private_ip jednego z:

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

Ale chciałbym zadeklarować zmienną w moim pliku var bezpośrednio i nie mieć Zadanie to zarejestrować. Byłoby miło, gdyby można było zrobić coś takiego:

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

Odpowiedz

-3

To zależy od kontekstu. jeśli chcesz pętle nad private_ip zmiennych w zadaniu, można to zrobić tak:

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

Zauważ, że to będzie drukować IPS 3 razy, ponieważ to będzie działać na każdym serwerze, więc w zależności od tego, co próbując to osiągnąć, musisz ustawić hosts: all na swoim serwerze frontendowym lub czymkolwiek innym.

Możesz to również zrobić w pliku Jinja2, jeśli planujesz wygenerować plik konfiguracyjny. Znowu wszystko zależy od tego, do czego dążysz.

pamiętać, że można uzyskać dostęp do informacji zebranych faktów IP automatycznie przez ansibla:

$ 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 
    }, 
    .... 

który może również być bardziej odpowiedni, w zależności od tego, co próbujesz zrobić.

Powodzenia.

+0

Dzięki. Tak, jak już powiedziałem, wiem, jak to zrobić w zadaniu iw szablonie. To, czego szukam, to utworzyć zmienną z listą prywatnych adresów IP, które mogę przekazać na przykład w różnych rolach. – Michael

+0

Czy możesz nam powiedzieć coś więcej na temat twojego przypadku użycia? W szczególności, użyjesz ich w szablonie? – leucos

+0

Nie, nie należy go używać w szablonie. Jedna z używanych przez mnie roli oczekuje listy adresów IP jako zmiennej. Mogłem utworzyć tę listę ręcznie w moim pliku vars, ale chciałbym utworzyć tę zmienną dynamicznie ze zmiennych private_ip, które zdefiniowałem na każdym hoście. – Michael

5

Można skorzystać z 'extract' filter dostać składników złożonego obiektu danych:

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

to świetnie, ale ansibla 2.1 jeszcze nie jest dostępna – alkar