Как обрабатывать изменения в сети и перезапускать с помощью Ansible?

Как обрабатывать изменения в сети и перезапускать с помощью Ansible?

В настоящее время я разрабатываю роль сетевой конфигурации, используемую 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.

  1. Используйте asyncи pollдля задачи перезапуска сети.
  2. Затем set_factобновить IP-адреса узлов.
  3. Далее дождитесь, пока порт SSH ответит на новом IP.
  4. Наконец, продолжайте выполнять оставшиеся задачи.
  - 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также жизнеспособно.

Связанный контент