2015-01-30 25 views
7

Tôi muốn cocatenate một nhóm các ips thành một chuỗi.ansible jinja2 concatenate địa chỉ IP

dụ IP1: 2181, IP2: 2181, IP3: 2181, vv

{% for host in groups['zookeeper'] %} 
    {{ hostvars[host]['ansible_eth0']['ipv4']['address'] }} 
{% endfor %} 

Tôi có đoạn code trên, nhưng dường như không thể khá tìm ra cách để nối thành một chuỗi.

tìm kiếm "Jinja2 nối" không cung cấp cho tôi thông tin tôi cần.

Trả lời

10

Đã cập nhật câu trả lời này, bởi vì tôi nghĩ rằng tôi đã hiểu nhầm câu hỏi của bạn.

Nếu bạn muốn tiếp nhau của IP của mỗi máy chủ với một số chuỗi, bạn có thể làm việc với các loop controls, để kiểm tra xem bạn đang ở phiên cuối:

{% for host in groups['zookeeper'] -%} 
    {{ hostvars[host]['ansible_eth0']['ipv4']['address'] }} 
    {%- if not loop.last %}, {% endif -%} 
{%- endfor %} 

Cũ câu trả lời:

từ bạn đang muốn tìm join:

{{ hostvars[host]['ansible_eth0']['ipv4']['address'] | join(", ") }} 
+0

Tôi chỉnh sửa các câu hỏi, vì tôi đã phạm sai lầm trong bỏ qua số cổng cần thiết . –

+0

Cổng đến từ đâu? Trong trường hợp nó là một giá trị cố định hoặc bên trong một var khác, chỉ cần thêm nó sau biểu thức var: '{{hostvars [host] ['ansible_eth0'] ['ipv4'] ['address']}}: {{port}} Các cổng ' – udondan

+0

'là các giá trị cố định –

3

sáng lập d giải pháp tương tự tại https://adamj.eu/tech/2014/10/02/merging-groups-and-hostvars-in-ansible-variables/.

Tôi đã làm một set_fact sử dụng một nhóm biến như đề xuất trong bài:

- hosts: all 
    connection: local 
    tasks: 
    - set_fact: 
     fqdn_list: | 
      {% set comma = joiner(",") %} 
      {% for item in play_hosts -%} 
       {{ comma() }}{{ hostvars[item].ansible_default_ipv4.address }} 
      {%- endfor %} 

này dựa trên sản phẩm mộc, trong đó có ưu điểm là không cần phải lo lắng về vòng lặp cuối cùng có điều kiện. Sau đó, với set_fact tôi có thể sử dụng chuỗi mới trong các tác vụ sau này.

7

Bạn có thể sử dụng bộ lọc 'extract' cho điều này (với điều kiện bạn sử dụng ansible>=2.1):

{{ groups['zookeeper'] | map('extract', hostvars, ['ansible_eth0', 'ipv4', 'address']) | join(',') }} 

Thông tin thêm: http://docs.ansible.com/ansible/playbooks_filters.html#extracting-values-from-containers

+1

Điều này bây giờ đã có và chắc chắn là một sự cải tiến so với các khả năng khác. –

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