
В настоящее время я разрабатываю роль сетевой конфигурации, используемую Ansible для настройки нашей новой виртуальной машины, созданной на основе нашего шаблона Debian 11.
Следующая роль меняется с DHCP на статическую конфигурацию интерфейса, а затем перезапускается сетевая служба. Для целей тестирования я установил IP/маску сети/шлюз как дополнительные переменные (и они динамически изменяются в зависимости от сервера, на котором я использую свою роль)
- name: ens3 reconfiguration
ansible.builtin.template:
src: interfaces.j2
dest: /etc/network/interfaces
- name: Restart networking.service
ansible.builtin.service:
name: networking
state: restarted
Вот содержимое interfaces.j2 для понимания.
# 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
Проблема в том, что сетевой интерфейс настроен на DHCP, например, 10.0.0.1. Я перенастраиваю его на 10.0.0.50, затем Ansible переходит к задаче перезапуска networking.service и зависает навсегда...
**С точки зрения Ansible, возможно ли динамически переподключиться к хосту с новым IP-адресом? Или, может быть, обойти результат выполнения перезапуска networking.service? **
решение1
Хотя это очень близко к вопросу, указанномуhttps://serverfault.com/users/378597/peter-zhabinиспользуетwin_shell, что не применимо к Linux.
На первый взгляд мне кажется, что это будет решением в Linux — заменить win_shell на shell, хотя я немного изменил предложение, чтобы оно больше соответствовало оболочке bash в Linux.
- Используйте
async
иpoll
для задачи перезапуска сети. - Затем
set_fact
обновить IP-адреса узлов. - Далее дождитесь, пока порт SSH ответит на новом IP.
- Наконец, продолжайте выполнять оставшиеся задачи.
- 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
Затем после регистрации добавьте в книгу еще одну задачу, wait_result
и эта задача может иметь условное предложение when, например:
when: network_responding|bool == true
Я преобразовал перезапуск в оболочку с bash, отложив операцию перезапуска в фоновый режим. Это может быть не нужно, но YMMV пытается использовать ту же логику сansible.встроенный.сервис, тестирование должно быть довольно простым для сравнения, если выполнение без этого shell
также жизнеспособно.