
Actualmente estoy desarrollando una función de configuración de red utilizada por Ansible para personalizar nuestra nueva máquina virtual que surgió de nuestra plantilla Debian 11.
La siguiente función cambia de DHCP a una configuración de interfaz estática y luego reinicia el servicio de red. Para fines de prueba, configuro IP/máscara de red/puerta de enlace como variables adicionales (y se cambia dinámicamente dependiendo del servidor en el que tengo que usar mi función)
- name: ens3 reconfiguration
ansible.builtin.template:
src: interfaces.j2
dest: /etc/network/interfaces
- name: Restart networking.service
ansible.builtin.service:
name: networking
state: restarted
Aquí está el contenido de interfaces.j2 para su comprensión.
# 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
El problema aquí es que, como la interfaz de red está configurada con dhcp, tiene, por ejemplo, 10.0.0.1, la reconfiguraré con 10.0.0.50, luego Ansible pasa a la tarea reiniciar networking.service y se bloquea para siempre...
**Desde la perspectiva de Ansible, ¿es posible volver a conectarse dinámicamente al host con la nueva IP? ¿O tal vez omitir el resultado de la ejecución del reinicio del networking.service? **
Respuesta1
Si bien está muy cerca de la pregunta enumerada porhttps://serverfault.com/users/378597/peter-zhabinusosganar_shell, que no es aplicable a Linux.
Desde el principio, parece que esta sería la solución en Linux, cambiando win_shell por shell, aunque modifiqué ligeramente la sugerencia para que se alinee más estrechamente con bash shell en Linux.
- Utilice
async
ypoll
para la tarea de reinicio de la red. - Luego
set_fact
actualizar la IP de los nodos. - Luego espere hasta que el puerto ssh responda en la nueva IP.
- Finalmente continúe con las tareas restantes.
- 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
Luego agregue otra tarea al libro de jugadas después de registrar wait_result
y esa tarea puede tener una cláusula condicional cuando como:
when: network_responding|bool == true
Convertí el reinicio a shell con bash, poniendo en segundo plano la operación de reinicio. Puede que esto no sea necesario, pero YMMV intenta usar la misma lógica conansible.servicio.integrado, las pruebas deberían ser bastante sencillas de comparar si hacer esto sin ellas shell
también es viable.