4

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

Мне нужно, чтобы мой хост Ansible дождался возвращения сервера и выполнил остальные мои задачи, но этого не происходит.

Это мои Ansible задачи, связанные с перезагрузкой и ожиданием:

...
- name: restart server
  shell: shutdown -r now
  async: 1
  poll: 0
  become: yes
  become_method: sudo
  ignore_errors: true
- name: waiting for server to come back after reboot
  local_action: wait_for host={{ ansible_ssh_host }} state=started port=22 delay=30 timeout=300 connect_timeout=15
....

Это результат запуска моей пьесы:

...

TASK [restart server] **********************************************************
fatal: [X.X.X.X]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh.", "unreachable": true}
    to retry, use: --limit @ansible_pb.retry

PLAY RECAP *********************************************************************
X.X.X.X               : ok=2    changed=0    unreachable=1    failed=0

Есть идеи, что не так и как я могу это исправить?

3 ответа3

7

Это общеизвестная проблема. См. Перезагрузка сервера и дождитесь его возвращения. Поскольку Ansible 1.9.4 SSH теряет соединение, прежде чем перейти к следующей задаче.

Вам нужно добавить задержку (sleep) перед командой shutdown :

- name: restart server
  shell: sleep 2 && shutdown -r now
  async: 1
  poll: 0
  become: yes
  become_method: sudo
  ignore_errors: true
- name: waiting for server to come back after reboot
  wait_for_connection:
....
1

В Ansible 2.7 был представлен модуль reboot , который решает эту проблему.

Ты можешь использовать:

- name: restart server
  reboot:
0

Я обнаружил, что это работает для меня для EX-407 (который основан на Ansible 2.3):

- name: restart the server
  shell: (sleep 2 && shutdown -r now) &
  async: 1
  poll: 0
  ignore_errors: true

- name: wait for the server to come back
  wait_for:
    host: "{{ inventory_hostname }}"
    port: 22
    delay: 15
  delegate_to: localhost

Что меня удивило, так это то, что опция «state: start» в модуле wait_for изначально вызывала сбой всего этого; wait_for не удалось обнаружить, что порт 22 снова открыт. Хотя не могу объяснить это поведение. После того, как опция "состояние" была удалена, playbook начал работать как положено.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .