
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.
- Use
async
epoll
para a tarefa de reinicialização da rede. - Em seguida
set_fact
, atualize o IP dos nós. - Em seguida, espere até que a porta ssh responda no novo IP.
- 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_result
e 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 shell
também for viável.