2
votes

Impression d'adresses IP en boucle

J'essaye de rassembler une ligne avec les adresses IP de mon cluster dans une boucle:

 lineinfile:
        path: "/etc/security/access.conf"
        line: "+:root:{{ nodelist }}"

Mais quand j'essaye de mettre cette ligne dans un fichier avec

set_fact: nodelist={%for host in groups['proxmox-cluster']%}"{{hostvars[host].ansible_all_ipv4_addresses|string}}"{% if not loop.last %},{% endif %}{% endfor %}

J'obtiens:

"[u'192.168.31.238 ']", "[u'192.168.31.248']", "[u'192.168.31.252 ']", "[u'192.168.31.250', u'192.168.1.250 ', u'192.168.32.250', u'192.168.33.250 '] "

au lieu de

192.168.31.238,192.168.31.248,192.168.31.252,192.168.31.250,192.168.1.250,192.168.32.250,192.168.33.250


0 commentaires

3 Réponses :


0
votes

Essayez une version plus simple ci-dessous

- set_fact:
    nodelist: "{{ nodelist|default([]) + hostvars[item].ansible_all_ipv4_addresses }}"
  loop: "{{ groups['proxmox-cluster'] }}"


0 commentaires

0
votes

Essayez avec un filtre sur la variable nodelist dans le module lineinfile :

lineinfile:
  path: "/etc/security/access.conf"
  line: "{{ nodelist | join(',') }}"


0 commentaires

1
votes

La raison en est que hostvars [host] .ansible_all_ipv4_addresses est un tableau. C'est la raison pour laquelle vous imprimez une liste jointe de chaînes à l'intérieur de tableaux "[u'192.168.31.238' Often","[u'192.168.31.248' Often"...

Si vous vous souhaitez uniquement imprimer les adresses ipv4 par défaut, vous pouvez remplacer votre expression hostvars par:

- name: Print ips in access.conf
  lineinfile:
    path:  /etc/security/access.conf
    line: "{{ groups['proxmox-cluster'] 
            | map('extract', hostvars, 'ansible_default_ipv4')
            | map(attribute='address')
            | join(',') }}"

Si vous souhaitez imprimer la première adresse dans la liste totale d'adresses, vous pouvez remplacer vos hostvars expression avec:

{% for host in groups['proxmox-cluster'] %}"{{ hostvars[host].ansible_all_ipv4_addresses | join(',') }}"{% if not loop.last %},{% endif %}{% endfor %}

Si vous voulez inclure toutes les adresses IP de tous hôtes, vous aurez besoin de deux boucles. Cela peut être fait avec la syntaxe du modèle Jinja2, des chaînes de filtres intelligentes ou les deux. Par exemple, remplacer l'expression entière par une combinaison d'une boucle jinja2 par un filtre vous donnera:

hostvars[host].ansible_all_ipv4_addresses | first

Personnellement, j'essaie d'éviter de mélanger la syntaxe du modèle Jinja2 dans des tâches / playbooks ansible. Il existe généralement une méthode plus propre en utilisant uniquement des chaînes de filtres. Dans votre cas, par exemple, vous pouvez faire quelque chose comme ceci:

hostvars[host].ansible_default_ipv4.address


1 commentaires

Merci beaucoup! Je préfère également ne pas mélanger cela, j'ai donc suivi votre suggestion. Et ça marche parfaitement ;-)