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