📜 Перезагрузка хоста с помощью Ansible

by itisgood

Перезагрузка хоста с помошью Ansible не сложная задача.

Предполагаются следующие шаги:

  • SSH подключение на хост
  • Перезагрузите хост
  • Отключитесь, прежде чем хост закроет ваше ssh-соединение
  • Подождите некоторое количество секунд, чтобы убедиться, что хост действительно выключен
  • Попробуйте подключиться по ssh к хосту и выполнить команду
  • Повторите попытку ssh, пока она не сработает

Все кажется достаточно ясным, но если Вы гуглили этот вопрос, вы скорее всего оказались на StackExchange, где дают много не совсем правильных ответов с 2015 года (и один правильный ответ).

Некоторые люди предлагают проверить порт 22, но только потому, что ssh что-то слушает, не означает, что он находится в состоянии, когда он принимает соединения.

Правильный ответ-использовать Ansible версии 2.7 или выше. 2.7 где ввел команду перезагрузки – reboot, и теперь все, что вам нужно сделать, это добавить это в свой плейбук:

- name: Reboot host and wait for it to restart
  reboot:
    msg: "Reboot initiated by Ansible"
    connect_timeout: 5
    reboot_timeout: 600
    pre_reboot_delay: 0
    post_reboot_delay: 30
    test_command: whoami

Этот playbook выполнит следующее:

  • Перезагрузит хост
  • Подождет 30 секунд
  • Попытается подключиться через SSH и запустить whoami
  • Отключится через 5 секунд, если не сработает ssh
  • Будет продолжать пытаться подключиться в течение 10 минут (600 секунд)

Добавьте директиву:

  notify: Reboot host and wait for it to restart

… в любой команде Ansible, которая требует перезагрузки после изменения  хост будет перезагружен, когда playbook завершится, а затем Ansible будет ждать, пока хост не станет доступным, и ssh будет работать, прежде чем перейти к следующему playbookу.

Если вам нужно перезагрузиться на полпути через playbook вы можете заставить все задачи выполниться с помощью команды:

- name: Reboot if necessary
  meta: flush_handlers

Я иногда делаю это, чтобы что-то изменить, заставить машину перезагрузиться, а затем проверить, что изменения вступили в силу и все в том же playbook.

Надеюсь, вам это помогло.

 

 

You may also like

7 комментариев

Александр 30.03.2021 - 22:28

Единственный и качественный ответ на всех просторах интернета. Спасибо большое!

Reply
itisgood 31.03.2021 - 06:20

Спасибо! Всегда рады!

Reply
Vladimir 12.06.2021 - 17:29

Не совсем понятно, что значит: “… Если вам нужно перезагрузиться на полпути через playbook вы можете заставить все задачи выполниться с помощью команды:”

Reply
itisgood 12.06.2021 - 18:08

время выполнения тасков плейбука

Reply
Vladimir 14.06.2021 - 17:09

Извините, все равно не понял, что подразумевается “на полпути через playbook”..?
В плейбуке, таски выполняются по очереди. Таким образом, если после выполнения таска, мне нужно перегрузится, я добавляю задачу:
– name: Reboot host and wait for it to restart
reboot:
Система ребутится, далее, ansible проверят что хост успешно загрузился и выполняет следующий таск в очереди.
По логике, вроде бы так…
А вот, “…если нужно перезагрузиться на полпути через playbook вы можете заставить все задачи выполниться с помощью команды:”
Вот тут не ясно….

Reply
itisgood 16.06.2021 - 18:34

можно сделать ребут и продолжить выполнение плейбука

Reply
Денис 03.02.2022 - 05:29

– name: Main Playbook
hosts: projectwsr
become: True

tasks:
– name: 1
apt:
upgrade: dist

– name: 2
hosts: projectwsr
become: True

tasks:
– name: 4

– name: 3
hosts: projectwsr
become: True

tasks:
– name: 4
ufw:
state: enabled
policy: allow
– name: 5
hosts: projectwsr
become: True

tasks:
– name: 6
ufw:
rule: allow
ports: 80
proto: tcp

Reply

Добавить комментарий для Александр Cancel Reply