Zugriff auf Hostvars für eine Hostgruppe in Ansible

7

Ich versuche, Ansible zu verwenden, um Einträge in die Server-Hosts-Datei hinzuzufügen. Ich habe eine Gruppe von Servern, die ich über ein privates LAN miteinander kommunizieren muss.

Meine Inventardatei:

[server_list]
server1
server2

Die Aufgabe, die ich versuche zu arbeiten:

- lineinfile: dest=/etc/hosts line="{{ hostvars[" {{ item }} "]['ansible_eth1']['ipv4']['address'] }}   {{ hostvars[" {{ item }} "]['ansible_hostname'] }}"
  with_items: groups['server_list']

Es macht nicht den Trick, ich verstehe das:

fatal: [server1] => host not found:  {{item}} 
fatal: [server2] => host not found:  {{item}} 

Dies ist im Grunde das gleiche wie das , aber in der neuen ansible variablen Zugriffsformat {{ }}.

Irgendwelche Ideen, wie man das macht?

melsayed
quelle

Antworten:

8

OK. Ich hatte das schon einmal versucht und es hat nicht wirklich funktioniert. Also muss ich da hinten etwas falsch gemacht haben.

Das funktioniert:

- lineinfile: dest=/etc/hosts line="{{ hostvars[item]['ansible_eth1']['ipv4']['address'] }}   {{ hostvars[item]['ansible_hostname'] }}"
  with_items: groups['server_list']

oder für 1.9 oder höher:

- lineinfile: dest=/etc/hosts line="{{ hostvars[item]['ansible_eth1']['ipv4']['address'] }}   {{ hostvars[item]['ansible_hostname'] }}"
  with_items: "{{ groups['server_list'] }}"
melsayed
quelle
Dies bricht in 1.9
bbaassssiiee
5

Hatte das gleiche Problem, wollte ich die Liste der Hosts in einer Gruppe durchgehen und dann Firewall-Regeln mit ihren IPs hinzufügen. Ich habe mir ein bisschen angesehen, wie hostvars [item] strukturiert ist, und den anderen Namen verwendet, um auf diesen Wert zuzugreifen. Das hat bei mir funktioniert:

- name: Setting up firewall so web_servers can access MySQL on port {{ mysql_port }}
  ufw: rule=allow proto=tcp to_port={{ mysql_port }} src="{{ hostvars[item]['ansible_default_ipv4']['address'] }}"
  with_items: groups.web_servers
Athropos
quelle
Perfekt! Besser als die Antworten oben ..
Stevemidgley
0

Ihre Syntax ist nur geringfügig falsch. Versuchen Sie es groups.server_listals Ihre with_items list.

Ich verwende host_vars nicht so wie Sie. Lassen Sie mich wissen, wenn bei diesem Teil Ihres Playbooks ein Parserfehler auftritt.

Im Folgenden sollte jedoch anstelle von {{item}} ein Hostname eingefügt werden.

- lineinfile: dest=/etc/hosts line="{{ hostvars[" {{ item }} "]['ansible_eth1']['ipv4']['address'] }}   {{ hostvars[" {{ item }} "]['ansible_hostname'] }}"
  with_items: groups.server_list
Christopher Karel
quelle
2
Nein. Immer noch kaputt. groups['server_list']ist korrekt erweitert. Ich denke, das Problem ist die Verschachtelung. {{}} itemin {{}} für Hostvars.
melsayed
0

Wenn Sie sowohl ein Präfix als auch ein Suffix hinzufügen und alles zu einer Liste machen müssen, sehen Sie sich Folgendes an:

  set_fact:
    extended_etcd_endpoints_list: "{{ groups['etcd'] | map('extract', hostvars, ['ansible_default_ipv4','address']) | map('regex_replace', '^(.*)$','https://\\1:2379') | list  }}"

Es nimmt die Liste aller Maschinen in der Gruppe etcd, extrahiert die IPv4, fügt vorne ein 'https: //' und am Ende ein ': 2379' hinzu. Schließlich wird alles in eine Liste umgewandelt.

ReSearchIT Eng
quelle