В настоящее время я создаю инструмент управления инфраструктурой, который предоставляет «голое железо» и виртуальные машины и т. Д. У нас есть рабочая виртуальная машина, которая запускает команды (через ansible) на удаленных узлах через SSH.
Один из шагов требует перезагрузки узлов для применения некоторых конфигураций. Рабочий процесс должен выполнить больше команд на узлах после завершения перезагрузки (должно выполняться синхронно).
У меня вопрос, как я могу проверить, завершилась ли перезагрузка?
Я мог бы добавить таймер сна (чтобы дождаться завершения перезагрузки), но мне кажется, что это плохое решение по ряду причин.
Другой вариант - попытаться подключиться по SSH к удаленному узлу из моего рабочего процесса каждые 5 секунд или около того, если это не удается, продолжайте пытаться снова, пока я не получу успешное соединение.
Есть ли другой способ сделать это?
Как вы упомянули, вы запускаете команды через ansible, вот что я использую для перезагрузки в playbook (я управляю машинами Ubuntu 14 / 16.04):
---
# execute like:
# ansible-playbook reboot.yaml --inventory hosts --extra-vars "hosts=all user=admin"
# or
# ansible-playbook reboot.yaml -i hosts -e "hosts=all user=admin"
- hosts: "{{ hosts }}"
remote_user: "{{ user }}"
become: yes
tasks:
# add this to to guard you from yourself ;)
#- name: "ask for verification"
# pause:
# prompt: "Are you sure you want to restart all specified hosts?"
# here comes the juicy part
- name: "reboot hosts"
shell: "sleep 2 && shutdown -r now 'Reboot triggered by Ansible'" # sleep 2 is needed, else this task might fail
async: "1" # run asynchronously
poll: "0" # don't ask for the status of the command, just fire and forget
ignore_errors: yes # this command will get cut off by the reboot, so ignore errors
- name: "wait for hosts to come up again"
wait_for:
host: "{{ inventory_hostname }}"
port: "22" # wait for ssh as this is what is needed for ansible
state: "started"
delay: "120" # start checking after this amount of time
timeout: "360" # give up after this amount of time
delegate_to: "localhost" # check from the machine executing the playbook
...
В Ansible 2.7 теперь есть модуль перезагрузки, поэтому вам не нужно создавать команды самостоятельно. Приведенный выше сценарий может быть таким:
---
# execute like:
# ansible-playbook reboot.yaml --inventory hosts --extra-vars "hosts=all user=admin"
# or
# ansible-playbook reboot.yaml -i hosts -e "hosts=all user=admin"
- hosts: "{{ hosts }}"
remote_user: "{{ user }}"
become: yes
tasks:
# add this to to guard you from yourself ;)
#- name: "ask for verification"
# pause:
# prompt: "Are you sure you want to restart all specified hosts?"
- name: "reboot hosts"
reboot:
msg: "Reboot triggered by Ansible"
reboot_timeout: 360
...
Если вы хотите проверить состояние хостов, время их перезагрузки и многие другие параметры, вам следует использовать программное обеспечение для мониторинга, например Zabbix, Nagios и так далее.
Время перезагрузки можно проверить uptime
системный параметр. Показывает время с момента последней загрузки. Вы можете получить его по команде uptime
на хосте Linux / UNIX или по протоколу SNMP удаленно, когда на хосте запущена служба snmpd:
snmpget -v2c -c public host_name_or_ip_address sysUpTime.0