2015-01-30 4 views
7

Ich möchte eine Gruppe von ips in eine Zeichenfolge cocatenate.ansible jinja2 verketten IP-Adressen

Beispiel IP1: 2181, IP2: 2181, IP3: 2181, etc

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

Ich habe den obigen Code, aber kann nicht scheinen, ganz um herauszufinden, wie in einen String verketten.

Suche nach "Jinja2 verketten" gibt mir nicht die Informationen, die ich brauche.

Antwort

10

Diese Antwort wurde aktualisiert, weil ich denke, dass ich Ihre Frage missverstanden habe.

Wenn Sie die IP-Adressen der einzelnen Hosts mit einigen Zeichenfolge verketten möchten, können Sie mit dem loop controls arbeiten, um zu überprüfen, ob Sie in der letzten Iteration sind:

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

Alte Antwort:

Das Wort Sie suchen join ist:

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

ich die Frage bearbeitet, weil ich einen Fehler in Weglassen der benötigten Port-Nummer aus . –

+0

Woher kommt der Hafen? Falls es sich um einen festen Wert oder um eine andere Variable handelt, fügen Sie sie einfach hinter dem Ausdruck var hinzu: '{{hostvars [host] ['ansible_eth0'] ['ipv4'] ['address']}}: {{port}} ' – udondan

+0

Ports sind feste Werte –

3

Foun d eine ähnliche Lösung bei https://adamj.eu/tech/2014/10/02/merging-groups-and-hostvars-in-ansible-variables/.

habe ich eine set_fact eine Gruppen mit Variable wie in der Post vorgeschlagen:

- 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 %} 

Diese auf Schreiner setzt, die den Vorteil nicht hat, hat bedingte über die letzte Schleife zu kümmern. Dann kann ich mit set_fact die neue Zeichenfolge in späteren Aufgaben verwenden.