2016-03-31 12 views
15

Hãy tưởng tượng một tập tin tồn kho như thế này:Ansible: Nhận tất cả các địa chỉ IP của một nhóm

node-01 ansible_ssh_host=192.168.100.101 
node-02 ansible_ssh_host=192.168.100.102 
node-03 ansible_ssh_host=192.168.100.103 
node-04 ansible_ssh_host=192.168.100.104 
node-05 ansible_ssh_host=192.168.100.105 

[mainnodes] 
node-[01:04] 

Trong playbook của tôi bây giờ tôi muốn tạo ra một số biến chứa địa chỉ IP của các nhóm mainnodes:

vars: 
    main_nodes_ips: "192.168.100.101,192.168.100.102,192.168.100.103,192.168.100.104" 
    main_nodes_ips_with_port: "192.168.100.101:3000,192.168.100.102:3000,192.168.100.103:3000,192.168.100.104:3000" 

Đây là những gì tôi có cho đến nay:

vars: 
    main_nodes_ips: "{{groups['mainnodes']|join(',')}}" 
    main_nodes_ips_with_port: "{{groups['mainnodes']|join(':3000,')}}" 

nhưng điều đó sẽ sử dụng các máy chủ na thay vì địa chỉ IP.

Bất kỳ ý tưởng nào về cách thực hiện điều này?

Cập nhật:

nhìn vào tài liệu trong một thời gian, tôi nghĩ rằng điều này sẽ cho phép tôi để lặp qua tất cả các adresses ip:

{% for host in groups['mainnodes'] %} 
    {{hostvars[host]['ansible_ssh_host']}} 
{% endfor %} 

Nhưng tôi chỉ không thể tìm ra cách để tạo một mảng chứa tất cả các IP này. Để tôi có thể sử dụng lệnh |join() trên chúng.

Update2:
tôi chỉ nghĩ rằng tôi đã figured it out ... nhưng nó chỉ ra rằng bạn không thể sử dụng {%}% cú pháp trong playbook ... hoặc có thể tôi? Cũng trong phần vars nó không. :/

vars: 
    {% set main_nodes_ip_arr=[] %} 
    {% for host in groups['mesos-slave'] %} 
    {% if main_nodes_ip_arr.insert(loop.index,hostvars[host]['ansible_ssh_host']) %} {% endif %} 
    {% endfor %} 
    main_nodes_ips: "{{main_nodes_ip_arr|join(',')}}" 
    main_nodes_ips_with_port: "{{main_nodes_ip_arr|join(':3000,')}}" 
+1

Đối với bất kỳ ai sử dụng phiên bản 2.0 ansible_ssh_host' đã không được chấp nhận. Giải pháp này vẫn hoạt động nhưng bạn cần phải thay thế nó bằng câu trả lời của 'ansible_host' – Pudding

Trả lời

1

Tôi đã tự làm việc đó ngay bây giờ. Tôi không quá hài lòng về giải pháp, nhưng nó sẽ làm:

main_nodes_ips: "{% set IP_ARR=[] %}{% for host in groups['mainnodes'] %}{% if IP_ARR.insert(loop.index,hostvars[host]['ansible_ssh_host']) %}{% endif %}{% endfor %}{{IP_ARR|join(',')}}" 
main_nodes_ips_with_port: "{% set IP_ARR=[] %}{% for host in groups['mainnodes'] %}{% if IP_ARR.insert(loop.index,hostvars[host]['ansible_ssh_host']) %}{% endif %}{% endfor %}{{IP_ARR|join(':3000,')} 
+3

@ McKelvin là giải pháp được chấp nhận, bởi vì nó vượt trội hơn mức này và cách được đề xuất bởi tài liệu chính thức Ansible để làm điều đó. –

3

tôi đã xem qua vấn đề này một khi trở lại và đây là những gì tôi đã đưa ra (không tối ưu, nhưng nó hoạt động)

--- 
# playbook.yml 
    - hosts: localhost 
    connection: local 

    tasks: 
     - name: create deploy template 
     template: 
      src: iplist.txt 
      dest: /tmp/iplist.txt 
     - include_vars: /tmp/iplist.txt 

     - debug: var=ip 

và file template là

ip: 
{% for h in groups['webservers'] %} 
- {{ hostvars[h].ansible_ssh_host }} 
{% endfor %} 
+0

Tạo một tác vụ có vẻ hơi quá mức. – Forivin

24

tôi thấy sự kỳ diệu map extracthere.

main_nodes_ips: "{{ groups['mainnodes'] | map('extract', hostvars, ['ansible_ssh_host']) | join(',') }}" 
main_nodes_ips_with_port: "{{ groups['mainnodes'] | map('extract', hostvars, ['ansible_ssh_host']) | join(':3000,') }}:3000" 

Một thay thế (ý tưởng xuất phát từ here):

main_nodes_ips: "{{ groups['mainnodes'] | map('extract', hostvars, ['ansible_eth0', 'ipv4', 'address']) | join(',') }}" 
+2

Ngón tay giữa to lớn để RedHat làm hỏng cổng hỗ trợ Ansible. Liên kết thứ hai đã chết. –

1

Tôi tìm thấy "cách duy nhất" để acceess của ip nhóm khác, khi bất cứ điều nào sau đây là đúng:

  • một số thành viên không được khởi động bởi ansible chưa
  • sử dụng nối tiếp
  • gro lên không phải là một phần của playbook

là như sau:

{% set ips=[] %}{% for host in groups['othergroup'] %}{% if ips.append(lookup('dig', host)) %}{% endif %}{% endfor %}{{ ips }} 

Yêu cầu dnspython trên máy chạy ansible, cài đặt qua

sudo apt-get install python-dnspython 

Nếu có ai biết một cách tốt hơn cho các điều kiện, Tôi rất muốn thoát khỏi sự ghê tởm này.

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