¿Cómo manejar los cambios de red y reiniciar con Ansible?

¿Cómo manejar los cambios de red y reiniciar con Ansible?

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.

  1. Utilice asyncy pollpara la tarea de reinicio de la red.
  2. Luego set_factactualizar la IP de los nodos.
  3. Luego espere hasta que el puerto ssh responda en la nueva IP.
  4. 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_resulty 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 shelltambién es viable.

información relacionada