Como lidar com alterações de rede e reiniciar com Ansible?

Como lidar com alterações de rede e reiniciar com Ansible?

Atualmente estou desenvolvendo uma função de configuração de rede usada pelo Ansible para personalizar nossa nova máquina virtual que veio de nosso modelo Debian 11.

A função a seguir muda de DHCP para configuração de interface estática e, em seguida, reinicia o serviço de rede. Para fins de teste, defino IP/máscara de rede/gateway como vars extras (e é alterado dinamicamente dependendo do servidor que tenho que usar minha função)

  - name: ens3 reconfiguration 
    ansible.builtin.template:
      src: interfaces.j2
      dest: /etc/network/interfaces
 
  - name: Restart  networking.service
    ansible.builtin.service:
      name: networking
      state: restarted

Aqui está o conteúdo de interfaces.j2 para compreensão.

# 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

O problema aqui é que, como a interface de rede está configurada com dhcp, ela tem, por exemplo, 10.0.0.1, eu a reconfiguro com 10.0.0.50, então o Ansible passa para a tarefa reiniciar networking.service e fica travado para sempre ...

**Do ponto de vista do Ansible, é possível reconectar-se dinamicamente ao host com o novo IP? ou talvez ignorar o resultado da execução da reinicialização networking.service ? **

Responder1

Embora muito próximo da questão listada porhttps://serverfault.com/users/378597/peter-zhabinusawin_shell, que não é aplicável ao Linux.

Pensando bem, parece que esta seria a solução no Linux, alterando win_shell para shell, embora eu tenha modificado ligeiramente a sugestão para que ela se alinhe mais ao bash shell no Linux.

  1. Use asynce pollpara a tarefa de reinicialização da rede.
  2. Em seguida set_fact, atualize o IP dos nós.
  3. Em seguida, espere até que a porta ssh responda no novo IP.
  4. Por fim, continue com as tarefas 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

Em seguida, adicione outra tarefa ao playbook após registrar wait_resulte essa tarefa pode ter uma cláusula when condicional como:

when: network_responding|bool == true

Converti a reinicialização para shell com bash, colocando em segundo plano a operação de reinicialização. Isso pode não ser necessário, mas YMMV está tentando usar a mesma lógica comansible.builtin.service, o teste deve ser bem simples de comparar se fazer isso sem shelltambém for viável.

informação relacionada