
Ich entwickle derzeit eine Netzwerkkonfigurationsrolle, die von Ansible verwendet wird, um unsere brandneue virtuelle Maschine anzupassen, die aus unserer Debian 11-Vorlage stammt.
Die folgende Rolle wechselt von DHCP zur statischen Schnittstellenkonfiguration und startet dann den Netzwerkdienst neu. Zu Testzwecken lege ich IP/Netzmaske/Gateway als zusätzliche Variablen fest (und es wird dynamisch geändert, abhängig vom Server, auf dem ich meine Rolle verwenden muss).
- name: ens3 reconfiguration
ansible.builtin.template:
src: interfaces.j2
dest: /etc/network/interfaces
- name: Restart networking.service
ansible.builtin.service:
name: networking
state: restarted
Hier ist der Inhalt von interfaces.j2 zum Verständnis.
# The primary network interface
auto ens3
iface ens3 inet static
address {{ ens3_ip }}/{{ ens3_netmask }}
gateway {{ ens3_gateway }}
dns-nameservers X.X.X.X
dns-search my_domain.net
Das Problem hierbei ist, dass die Netzwerkschnittstelle per DHCP konfiguriert ist und beispielsweise 10.0.0.1 hat. Ich konfiguriere sie neu mit 10.0.0.50, dann wechselt Ansible zur Aufgabe „Networking.service neu starten“ und es hängt sich für immer auf …
**Ist es aus Ansible-Sicht möglich, dynamisch mit der neuen IP erneut eine Verbindung zum Host herzustellen? Oder vielleicht das Ausführungsergebnis des Neustarts von networking.service zu umgehen?**
Antwort1
Obwohl es sehr nah an der Frage vonhttps://serverfault.com/users/378597/peter-zhabinVerwendetwin_shell, was auf Linux nicht anwendbar ist.
Spontan fällt mir ein, dass dies die Lösung unter Linux wäre, nämlich win_shell durch Shell zu ersetzen, obwohl ich den Vorschlag leicht abgeändert habe, damit er sich stärker an der Bash-Shell unter Linux orientiert.
- Verwenden Sie
async
undpoll
für die Aufgabe „Netzwerkneustart“. set_fact
Aktualisieren Sie anschließend die Knoten-IP.- Warten Sie anschließend, bis der SSH-Port auf der neuen IP antwortet.
- Fahren Sie abschließend mit den verbleibenden Aufgaben fort.
- name: Async restart of networking.service
shell: "sleep 1; systemctl restart networking.service &"
args:
executable: /bin/bash
async: 100
poll: 0
- name: set_fact for the nodes new IP
set_fact:
ansible_host: "10.0.0.50"
- name: wait_for ssh port access
local_action:
module: wait_for
host: "{{ ansible_host }}"
port: 22
delay: 60
state: started
register: network_responding
Fügen Sie nach der Registrierung eine weitere Aufgabe zum Playbook hinzu. wait_result
Diese Aufgabe kann eine bedingte „Wann“-Klausel enthalten, wie:
when: network_responding|bool == true
Ich habe den Neustart mit Bash in die Shell umgewandelt und den Neustartvorgang in den Hintergrund gestellt. Dies ist möglicherweise nicht erforderlich, aber Sie können die gleiche Logik mit YMMV verwenden.ansible.builtin.service, das Testen sollte ziemlich einfach sein, um zu vergleichen, ob dies shell
auch ohne machbar ist.