Ich möchte mit Ansible eine geordnete Liste der Netzwerkschnittstellen auf einem Computer erhalten. Moderne Linux-Systeme verwenden eth0, eth1 usw. nicht. Die Namen sind also unvorhersehbar. In unserem Netzwerk verbinden wir die Schnittstelle mit der niedrigsten Nummer mit dem LAN und die Schnittstelle mit der höchsten Nummer mit dem WAN, sodass ich die Position der Schnittstelle in einer geordneten Liste verwenden kann, um ihre Funktion zu bestimmen.
Ich suche nach dem kanonischen Weg, dies in Ansible zu tun. Damit ich so etwas wie {{ansible_eth0.ipv4.address}} verwenden kann. (Wobei eth0 ein anderer Name ist).
Selbst wenn ich manuell eine Variable mit dem Namen der Schnittstelle setze, scheint es keine Möglichkeit zu geben, die IP dieser Schnittstelle zu ermitteln (unter Verwendung des Inhalts der Variablen).
Ich möchte die Ansible-Fakten verarbeiten, um das zu erhalten, was ich möchte, anstatt ein Shell-Skript auf dem Remote-System auszuführen.
ansible_default_ipv4.address
dass dies die Standard-IPv4-Adresse undansible_default_ipv4.interface
die Standard-IPv4-Schnittstelle angibt. Dies beantwortet Ihre Frage nicht, hat mir jedoch als Problemumgehung in einer Situation geholfen, in der die Standardschnittstelleeth0
auf bestimmten Systemen undeth1
auf anderen benannt wurde.Antworten:
Die
ansible_interfaces
Tatsache listet alle vorhandenen Netzwerkschnittstellen auf.quelle
Ich verstehe, woher Neik kommt, also habe ich nach einigem Experimentieren eine Aufgabe gefunden, die den Trick macht.
Wie Michael Hamilton oben erwähnt hat
ansible_interfaces
, enthält die Tatsache eine Liste aller Netzwerkschnittstellen und sie scheinen in Ordnung zu sein (dh die erste Ethernet-Schnittstelle hätte eth0, die zweite eth1 usw. genannt). Also ein bisschenset_fact
Magie und viel Experimentieren später:Dies durchläuft alle
ansible_interfaces
Einträge für die aktuelle Maschine und erstellt eine Liste derhostvars[inventory_hostname]['ansible_' + item]
Einträge, dietype
gleich "ether" sind.Also jetzt
ansible_eth.0
undansible_eth.1
sollte in etwa dem altenansible_eth0
bzw.ansible_eth1
entsprechen.Ich habe dies nicht gründlich getestet, um sicherzustellen, dass die Bestellung immer wie erwartet funktioniert, aber es scheint den Trick zu tun.
Vielen Dank an diese StackOverflow-Antwort, die mir gezeigt hat, wie man die Liste mit with_items erstellt.
quelle
with_items:
- "{{ hostvars[inventory_hostname]['ansible_interfaces'] }}"
Kann ersetzt werden durch:with_items: "{{ansible_interfaces}}"
Einige Hinweise, um eine Schnittstelle zu erhalten, wenn wir einige Informationen kennen:
einige kurze Erklärungen:
ansible_facts
ansible_facts.interfaces
ist das gleiche wieansible_interfaces
quelle
Es ist schon eine Weile her, seit ich ansible berührt habe, aber ohne weitere Details würde ich etwas erwarten wie:
arbeiten...
quelle