Reboot in Ansible 2.1.1.0

Sep 26, 2016 22:35 · 264 words · 2 minute read ansible

После обновления Ansible до версии 2.1.1.0 перестал работать довольно простой набор инструкций для удаленной перезагрузки хостов, который успешно работал в Ansible версии 1.9. Давайте разберемся!

Работавший ранее плейбук reboot.yml выглядел так:

---
- hosts: test
  sudo: yes
  tasks:
 
  - name: Reboot host
    command: shutdown -r now "Ansible system reboot"
    async: 0
    poll: 0
  - name: Wait for the host to finish rebooting
    local_action: wait_for host={{ inventory_hostname }} state=started
    sudo: false

После обновления версии Ansible выполнение данного набора инструкций завершается следующим образом:

ansible-playbook playbooks/reboot.yml

PLAY [test] ********************************************************************

TASK [setup] *******************************************************************
ok: [test]

TASK [Reboot host] *************************************************************
fatal: [test]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh.", "unreachable": true}
	to retry, use: --limit @playbooks/reboot.retry

PLAY RECAP *********************************************************************
test                   : ok=1    changed=0    unreachable=1    failed=0

Примечание. При этом удаленный хост перезагружается — можем в этом убедиться с помощью пинга в соседней консоли (или просто проверить uptime удаленной машины).

Для корректного выполнения данного набора инструкций (перезагрузки и ожидания пока удаленный хост вновь появится онлайн) в текущей версии Ansible необходимо привести плейбук к следующему виду:

---
- hosts: test
  become: yes
  tasks:
 
  - name: Reboot host
    shell: sleep 2 && /sbin/shutdown -r now "Ansible system reboot"
    async: 1
    poll: 0
  - name: Wait for the host to finish rebooting
    local_action: wait_for host={{ inventory_hostname }} port=22 delay=20 connect_timeout=200
    become: false
    delegate_to: localhost

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

ansible-playbook playbooks/reboot.yml

PLAY [test] ********************************************************************

TASK [setup] *******************************************************************
ok: [test]

TASK [Reboot host] *************************************************************
ok: [test]

TASK [Wait for the host to finish rebooting] ***********************************
ok: [test -> localhost]

PLAY RECAP *********************************************************************
test                   : ok=3    changed=0    unreachable=0    failed=0
tweet Share