2014-10-21 17 views
6

Với hàng tồn kho này:ansible: loại danh sách hiểu?

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

Làm thế nào tôi có thể nhận được một danh sách các ip riêng của máy chủ web?

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

Tôi biết groups['webservers'] sẽ cho tôi danh sách này ['10.0.0.51', '10.0.0.52', '10.0.0.53'] và tôi có thể nhận được private_ip của một với:

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

Nhưng tôi muốn khai báo một biến trong file var tôi trực tiếp và không có một nhiệm vụ để đăng ký nó. Sẽ thật tuyệt nếu một số điều như sau có thể được thực hiện:

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

Trả lời

-3

Tùy thuộc vào ngữ cảnh. nếu bạn muốn vòng qua private_ip biến trong một nhiệm vụ, bạn có thể làm điều đó như vậy:

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

Lưu ý rằng điều này sẽ in IP 3 lần, vì nó sẽ chạy trên mỗi máy chủ, vì vậy tùy thuộc vào những gì bạn đang cố gắng đạt được, bạn sẽ phải đặt hosts: all vào máy chủ giao diện người dùng của mình hoặc bất kỳ thứ gì.

Bạn cũng có thể thực hiện việc này trong tệp Jinja2 nếu bạn dự định tạo một số tệp cấu hình. Một lần nữa, tất cả phụ thuộc vào những gì bạn đang nhắm tới.

Lưu ý rằng bạn có thể truy cập thông tin IP trong sự kiện thu thập tự động bởi 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 
    }, 
    .... 

mà cũng có thể phù hợp hơn, tùy thuộc những gì bạn đang cố gắng làm.

Chúc may mắn.

+0

Cảm ơn. Vâng, như tôi đã nói, tôi biết cách thực hiện nó trong một nhiệm vụ và trong một mẫu. Những gì tôi đang tìm kiếm là tạo một biến với danh sách các IP riêng mà tôi có thể truyền vào các vai trò khác nhau chẳng hạn. – Michael

+0

Bạn có thể cho chúng tôi biết thêm về trường hợp sử dụng của bạn không? Đặc biệt, bạn sẽ sử dụng chúng trong một mẫu? – leucos

+0

Không, nó không được sử dụng trong một mẫu. Một trong những vai trò mà tôi sử dụng dự kiến ​​là danh sách các địa chỉ IP dưới dạng biến. Tôi có thể tạo danh sách này theo cách thủ công trong tệp vars của tôi nhưng tôi muốn tạo biến này động từ các biến private_ip mà tôi đã xác định trên mỗi máy chủ. – Michael

5

Bạn có thể tận dụng lợi thế của 'extract' filter để có được các thành phần của một đối tượng dữ liệu composit:

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

đó là tuyệt vời nhưng ansible 2.1 chưa được nêu ra – alkar

Các vấn đề liên quan