Назад | Перейти на главную страницу

Как я могу проверить, что перезагрузка завершена?

В настоящее время я создаю инструмент управления инфраструктурой, который предоставляет «голое железо» и виртуальные машины и т. Д. У нас есть рабочая виртуальная машина, которая запускает команды (через 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