ждать
v2.2
Здравствуй,
У меня есть нижеприведенная часть моего плейбока, чтобы обновить все системные пакеты, перезагрузить компьютер и дождаться его возврата. Доступный playbook закрывается при перезагрузке машины и не ждет, пока хост вернется в сеть и запустит оставшийся playbook. Не могли бы вы предложить?
- name: reboot the system when package is upgraded
command: /sbin/shutdown -r now "Ansible system package upgraded"
when: latest_state.changed
tags: upgrade_packages_all
- name: waiting for server to come back
local_action: wait_for host={{ ansible_default_ipv4.address }} port=22 state=started delay=30 timeout=60
sudo: false
tags: upgrade_packages_all
TASK [vmsetup : reboot the system when package is upgraded] ********************
fatal: [96.119.246.13]: FAILED! => {"changed": false, "failed": true, "module_stderr": "", "module_stdout": "PolicyKit daemon disconnected from the bus.\r\nWe are no longer a registered authentication agent.\r\n", "msg": "MODULE FAILURE", "parsed": false}
Перезагрузка работает, но неиспользуемый playbook потерял соединение, как показано с ошибкой выше.
#tail -f /var/log/messages
Feb 10 16:25:30 nrpe[872]: Daemon shutdown
Connection to xx.xxx.xxx.xx closed by remote host.
Connection to xx.xxx.xxx.xx closed.
Сообщите мне, если требуются какие-либо подробности. Благодарю.
Благодаря,
Говинд
добавить && sleep 1
shell: /sbin/shutdown -r now "Ansible system package upgraded" && sleep 1
как обходной путь, чтобы избежать разрыва соединения до того, как Ansible сможет «пожать» временные файлы и закрыть соединение.
Как и информация, это задокументировано на https://support.ansible.com/hc/en-us/articles/201958037-Reboot-a-server-and-wait-for-it-to-come-back, хотя и не поддерживается. в документах этого репозитория и не отображается на docs.ansible.com
@bcoca Добавлено, как вы сказали, но все равно столкнулось с той же ошибкой. Я должен использовать ignore_errors: true, чтобы пропустить эту ошибку.
Ошибка:
фатальный: [96.119.246.13]: НЕ ВЫПОЛНЕНО! => {"changed": false, "failed": true, "module_stderr": "", "module_stdout": "Демон PolicyKit отключен от шины. r \ nМы больше не зарегистрированный агент аутентификации.r \ n", "msg": "ОТКАЗ МОДУЛЯ", "parsed": false}
У меня была такая же проблема с 2.0.0.2, мне помог этот обходной путь:
- name: Wait for server come back
wait_for: >
host="{{ inventory_hostname }}"
port=22
delay=15
timeout=60
delegate_to: localhost
@ gvenka008c :
Вы можете попробовать:
shell: sleep 2 && /sbin/shutdown -r now
@andyhky заработало !! :) Спасибо! Окончательное решение в Ansible 2.1, которое работает, выглядит следующим образом
- name: Restart server
become: yes
shell: sleep 2 && /sbin/shutdown -r now "Ansible system package upgraded"
- name: waiting 30 secs for server to come back
local_action: wait_for host={{ ansible_default_ipv4.address }} port=22 state=started delay=30 timeout=60
become: false
@sayantandas, у вас все еще работает решение? Я использую ansible 2.1.1.0 и получаю следующее:
UNREACHABLE! => {"changed": false, "msg": "SSH Error: data could not be sent to the remote host. Make sure this host can be reached over ssh", "unreachable": true}
Я нашел этот ответ, который решает проблему для меня: http://stackoverflow.com/a/39174307
- name: Restart server
become: yes
shell: sleep 2 && /sbin/shutdown -r now "Ansible system package upgraded"
async: 1
poll: 0
local_action
после перезагрузки shell
всегда пропускается для меня. Взгляд на вывод -vvv
указывает только на то, что он был пропущен из-за условия. Кто-нибудь еще испытывает это? Я могу открыть новый билет, если он не имеет отношения к делу.
Я могу подтвердить, что это полностью сломалось на 2.1 в нашей установке. У нас он работал с 1.9 способом «1.9», обновил Ansible до 2.1, изменил задачу на «2.1», и каждый раз он ломается.
Это решение вроде работает с моей установкой. Однако local_action
каждый раз ожидает весь таймаут: мой хост может перезапуститься через ~ 30 секунд, но если я установлю тайм-аут wait_for
на 3600, Ansible будет ждать один час, прежде чем продолжить playbook. .. Так как некоторые перезагрузки могут длиться дольше, чем другие (обновления), мне действительно нужен большой тайм-аут, но я не могу позволить себе тратить 15 минут, чтобы мои хосты вернулись (в моем основном сценарии это происходит 5 раз :()
После небольшого количества проб и ошибок с различными решениями, опубликованными для разных версий, на 2.1.2 с гостевой виртуальной машиной Ubuntu 16.04 и хостом OS X с использованием Vagrant (1.8.6) и VirtualBox (5.1.8) у меня работает следующее.
- name: "Reboot if required"
shell: sleep 2 && shutdown -r now 'Reboot required' removes=/var/run/reboot-required
become: true
async: 1
poll: 0
ignore_errors: true
- name: "Wait for reboot"
local_action: wait_for host={{ ansible_default_ipv4.address }} port=22 delay=10 state=started
become: false
@Furiml : Не уверен, применимо ли это к тому, что вы пытаетесь сделать, но эта вторая задача будет опрашиваться каждые 10 секунд (по умолчанию) после 10-секундной задержки, чтобы увидеть, открыт ли порт 22 на гостевой машине, прежде чем продолжить, т.е. не принимает значение полного выделенного тайм-аута.
Также было бы неплохо обновить документы и / или статью поддержки для использования предпочтительного полного формата YAML для задач. Это работает для меня:
- name: reboot nodes
shell: sleep 2 && shutdown -r now "Ansible reboot"
async: 1
poll: 0
ignore_errors: true
- name: wait for server to come back
local_action: wait_for
args:
host: "{{ inventory_hostname }}"
port: 22
state: started
delay: 30
timeout: 300
Я написал еще кое-что, чтобы проверить это. Вместо того, чтобы ждать включения хоста, я хочу дождаться его отключения.
- name: "Wait for the machine to be down"
local_action: wait_for
args:
host={{target}}
port=22
state=stopped
delay=1
timeout=3600
become: false
Если я хорошо понял, это будет опрашивать порт 22 моей цели каждую секунду и продолжится, только если он будет закрыт. Я сам выключил машину, но Ansible завис на 5 минут :(
@martineg отлично работает! Теперь он включен в роль Galaxy jmcvetta.debian-upgrade-reboot
.
На ansible 2.2 это не перезагружает мой компьютер. Он просто говорит, что работа запущена, а затем ждет 22 порта. Но узел не перезагружается!
У меня та же проблема, что и у @sashgorokhov в Ubuntu 16.04 / ansible 2.2.1.0.
Просто говорит «ОК» и не перезагружается.
ok: [IP] => {
"ansible_job_id": "575686775528.32762",
"changed": false,
"finished": 0,
"results_file": "/root/.ansible_async/575686775528.32762",
"started": 1
}
@NoahO, может быть, этот крошечный фрагмент кода может вам помочь:
tasks:
- shell: shutdown -r now
Это просто перезагружает узел, не дожидаясь его (в моем случае мне действительно не нужно ждать его перезагрузки)
@sashgorokhov, к сожалению, мне нужно, чтобы он перезагрузился, работал над этим с помощью команды at, но тратит 1 минуту, прежде чем предпринимать какие-либо действия, поэтому я бы предпочел, чтобы это работало.
Попытка заставить это работать на серверах Centos 7.3 с рабочей станции F25 с Ansible 2.2.1, но, похоже, не работает. Есть обходной путь?
На этом этапе я серьезно подумываю создать отдельную роль для задачи, которую мне нужно выполнить после перезагрузки, и вызвать 2 роли из сценария оболочки с достаточно долгим сном между ними, или, если я хочу быть необычным, я могу добавить ssh-keyscan а также чтобы убедиться, что сервер работает ... Но я бы предпочел полагаться на Ansible, знаете ли, поскольку это настоящий инструмент автоматизации;)
РЕДАКТИРОВАТЬ:
Хорошо, я был полным идиотом, и здесь уже почти полночь, я не боюсь это признать ... НЕПРАВИЛЬНЫЙ ИНВЕНТАРЬ FFS. Работает! Сожалею...
Такая же проблема. Есть новости по этому поводу? Похоже, многие люди сталкиваются с этой проблемой
Это все еще проблема (Mac версии 2.3.0.0), целью является экземпляр Fedora в AWS. Ни одно из вышеперечисленных обходных путей у меня не сработало (ошибка не была, но и не перезагружалась), поэтому я сделал следующее (где delayed_reboot - это просто сценарий оболочки, сон и перезагрузка):
- copy:
src: files/delayed_reboot
dest: /tmp/delayed_reboot
owner: root
group: root
mode: 0700
- name: Restart machine
shell: nohup /tmp/delayed_reboot &
async: 1
poll: 0
ignore_errors: true
become: true
become_method: sudo
when: new_kernel.changed or new_kernel_headers.changed
- name: Wait for machine to restart
local_action:
module: wait_for
host={{ inventory_hostname }}
port=22
delay=20
timeout=300
state=started
become: false
when: new_kernel.changed or new_kernel_headers.changed
Общее соединение
ansible 2.3.0.0
config file = /Users/ebalduf/PD-git/LabOnDemand/ansible.cfg
configured module search path = Default w/o overrides
python version = 2.7.13 (default, Dec 18 2016, 07:03:39) [GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)]
grep '^[^#]' ansible.cfg
[defaults]
host_key_checking = False
timeout = 15
[privilege_escalation]
[paramiko_connection]
[ssh_connection]
control_path = %(directory)s/%%h-%%r
[persistent_connection]
[accelerate]
[selinux]
[colors]
[diff]
Ansible host: macOS Sierra 10.12.4.
цель: экземпляр Fedora 25 в AWS.
- name: install python and deps for ansible modules
raw: dnf install -y python2 python2-dnf libselinux-python
- name: gather facts
setup:
- name: Install new Kernel
dnf:
name: https://kojipkgs.fedoraproject.org//packages/kernel/4.9.13/201.fc25/x86_64/kernel-core-4.9.13-201.fc25.x86_64.rpm
register: new_kernel
- name: Install new Kernel headers
dnf:
name: https://kojipkgs.fedoraproject.org//packages/kernel/4.9.13/201.fc25/x86_64/kernel-headers-4.9.13-201.fc25.x86_64.rpm
register: new_kernel_headers
- name: Restart machine
command: reboot
async: 1
poll: 0
ignore_errors: true
become: true
become_method: sudo
when: new_kernel.changed or new_kernel_headers.changed
- name: Wait for machine to restart
local_action:
module: wait_for
host={{ inventory_hostname }}
port=22
delay=20
timeout=300
state=started
become: false
when: new_kernel.changed or new_kernel_headers.changed
- Вы также можете вставить ссылки gist.github.com для больших файлов
Целевой объект должен правильно перезагрузиться и продолжить выполнение сценария.
Смотрите вывод ниже с -vvv
Using module file /usr/local/lib/python2.7/site-packages/ansible/modules/commands/command.py
<34.209.10.206> ESTABLISH SSH CONNECTION FOR USER: fedora
<34.209.10.206> SSH: EXEC ssh -C -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o User=fedora -o ConnectTimeout=15 -o ControlPath=/Users/ebalduf/.ansible/cp/%h-%r 34.209.10.206 '/bin/sh -c '"'"'echo ~ && sleep 0'"'"''
<34.209.10.206> (0, '/home/fedora\n', '')
<34.209.10.206> ESTABLISH SSH CONNECTION FOR USER: fedora
<34.209.10.206> SSH: EXEC ssh -C -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o User=fedora -o ConnectTimeout=15 -o ControlPath=/Users/ebalduf/.ansible/cp/%h-%r 34.209.10.206 '/bin/sh -c '"'"'( umask 77 && mkdir -p "` echo /home/fedora/.ansible/tmp/ansible-tmp-1493487050.48-176600574616672 `" && echo ansible-tmp-1493487050.48-176600574616672="` echo /home/fedora/.ansible/tmp/ansible-tmp-1493487050.48-176600574616672 `" ) && sleep 0'"'"''
<34.209.10.206> (0, 'ansible-tmp-1493487050.48-176600574616672=/home/fedora/.ansible/tmp/ansible-tmp-1493487050.48-176600574616672\n', '')
<34.209.10.206> PUT /var/folders/sd/5jlrqcms5qg3bjc0g5mp5r1r0000gn/T/tmpeV4QiT TO /home/fedora/.ansible/tmp/ansible-tmp-1493487050.48-176600574616672/command.py
<34.209.10.206> SSH: EXEC sftp -b - -C -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o User=fedora -o ConnectTimeout=15 -o ControlPath=/Users/ebalduf/.ansible/cp/%h-%r '[34.209.10.206]'
<34.209.10.206> (0, 'sftp> put /var/folders/sd/5jlrqcms5qg3bjc0g5mp5r1r0000gn/T/tmpeV4QiT /home/fedora/.ansible/tmp/ansible-tmp-1493487050.48-176600574616672/command.py\n', '')
<34.209.10.206> ESTABLISH SSH CONNECTION FOR USER: fedora
<34.209.10.206> SSH: EXEC ssh -C -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o User=fedora -o ConnectTimeout=15 -o ControlPath=/Users/ebalduf/.ansible/cp/%h-%r 34.209.10.206 '/bin/sh -c '"'"'chmod u+x /home/fedora/.ansible/tmp/ansible-tmp-1493487050.48-176600574616672/ /home/fedora/.ansible/tmp/ansible-tmp-1493487050.48-176600574616672/command.py && sleep 0'"'"''
<34.209.10.206> (0, '', '')
<34.209.10.206> ESTABLISH SSH CONNECTION FOR USER: fedora
<34.209.10.206> SSH: EXEC ssh -C -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o User=fedora -o ConnectTimeout=15 -o ControlPath=/Users/ebalduf/.ansible/cp/%h-%r -tt 34.209.10.206 '/bin/sh -c '"'"'sudo -H -S -n -u root /bin/sh -c '"'"'"'"'"'"'"'"'echo BECOME-SUCCESS-jplodcrkimvnywjebybiuhwijxipglmt; /usr/bin/python /home/fedora/.ansible/tmp/ansible-tmp-1493487050.48-176600574616672/command.py; rm -rf "/home/fedora/.ansible/tmp/ansible-tmp-1493487050.48-176600574616672/" > /dev/null 2>&1'"'"'"'"'"'"'"'"' && sleep 0'"'"''
<34.209.10.206> (255, '', 'Shared connection to 34.209.10.206 closed.\r\n')
fatal: [34.209.10.206]: UNREACHABLE! => {
"changed": false,
"unreachable": true
}
MSG:
Failed to connect to the host via ssh: Shared connection to 34.209.10.206 closed.
Спасибо @ebalduf за то, что
Код ниже работает для меня
Версия Ansible - 2.3
Сервер - Ubuntu 16.04.2 LTS
Целевая система - RHEL 7.3
- name: restart server
become: yes
shell: sleep 2 && /sbin/shutdown -r now "RedHat system package upgraded"
async: 1
poll: 0
- name: waiting 60 secs for server to come back
become: false
local_action: wait_for host={{ ansible_default_ipv4.address }} port=22 state=started delay=60 timeout=120
Решение, предоставленное @sayantandas, также работает для нас.
Версия Ansible: 2.3.0.0
Версия сервера: CentOS Linux, выпуск 7.3.1611
Целевая система: CentOS Linux версии 7.3.1611
Решение, предоставленное @sayantandas , тоже работает для меня
Версия Ansible: 2.3.0.0
Версия сервера: RHEL 7.3
Целевая система: RHEL 7.3
Спасибо
Ansible 2.3, Centos7, ниже - это то, что я использовал после того, как сделал что-то, что обновляет ядро, избегая «ожидания загрузки хоста», если хост не перезагружается.
- name: Check for reboot hint.
shell: LAST_KERNEL=$(rpm -q --last kernel | perl -pe 's/^kernel-(\S+).*/$1/' | head -1);CURRENT_KERNEL=$(uname -r); if [ $LAST_KERNEL != $CURRENT_KERNEL ]; then echo 'reboot'; else echo 'no'; fi
ignore_errors: true
register: reboot_hint
- name: Rebooting ...
shell: sleep 2 && /usr/sbin/reboot
async: 1
poll: 0
ignore_errors: true
when: reboot_hint.stdout.find("reboot") != -1
- name: Wait for host to boot
become: false
local_action: wait_for
args:
host: "{{ inventory_hostname }}"
port: 22
state: started
delay: 30
timeout: 180
when: reboot_hint.stdout.find("reboot") != -1
Невозможно правильно перезагрузить компьютер даже после проверки работоспособности.
Ansible 2.2.2.0
Пример сценария для Ubuntu 16.04 LTS
---
- name: Refresh apt cache
apt:
update_cache: yes
- name: Update all packages
apt:
upgrade: dist
- name: Rebooting server
shell: >
sleep 2 &&
/sbin/shutdown -r now "Ansible system package upgraded"
async: 1
poll: 0
ignore_errors: true
- name: Wait for host to boot
become: false
local_action: wait_for
args:
host: "{{ inventory_hostname }}"
port: 22
state: started
delay: 30
timeout: 200
- name: Sanity check
shell: ps -ef | grep sshd | grep `whoami` | awk '{print \"kill -9\", $2}' | sh
async: 1
poll: 0
ignore_errors: true
- name: Remove useless packages from the cache
apt:
autoclean: yes
- name: Remove dependencies that are no longer required
apt:
autoremove: yes
Результат
TASK [apt-refresh : Remove useless packages from the cache] ********************
fatal: [xxxx]: FAILED! => {"changed": false, "failed": true, "module_stderr": "OpenSSH_7.2p2 Ubuntu-4ubuntu2.2, OpenSSL 1.0.2g 1 Mar 2016\r\ndebug1: Reading configuration data /etc/ssh/ssh_config\r\ndebug1: /etc/ssh/ssh_config line 19: Applying options for *\r\ndebug1: auto-mux: Trying existing master\r\ndebug1: mux_client_request_session: master session id: 2\r\nShared connection to xxxx closed.\r\n", "module_stdout": "Traceback (most recent call last):\r\n File \"/tmp/ansible_MJ_gDg/ansible_module_apt.py\", line 903, in <module>\r\n main()\r\n File \"/tmp/ansible_MJ_gDg/ansible_module_apt.py\", line 855, in main\r\n for package in packages:\r\nTypeError: 'NoneType' object is not iterable\r\n", "msg": "MODULE FAILURE"}
ansible.cfg
[defaults]
inventory = hosts
host_key_checking = False
remote_user = ubuntu
private_key_file = id_rsa
retry_files_enabled = False
[ssh_connection]
ssh_args = -C -o ControlMaster=auto -o ControlPersist=60s
control_path = /tmp/%%h-%%p-%%r
У меня были похожие проблемы. Я добавил задачу «пауза» на 30 секунд между оболочкой: shutdown now -r и задачей wait_for. Теперь все стабильно работает. У меня также есть обработчики с прослушиванием, поэтому они запускаются только при необходимости.
У меня были аналогичные проблемы при попытке перезагрузить наши хосты Ubuntu 16.04 с ansible, настроенным на использование python3. Как только я установил python 2.7 на хосты Ubuntu 16.04 (apt-get install python-minimal) и настроил ansible для его использования в удаленной системе, перезагрузка прошла нормально.
Всякий раз, когда я использовал "async" в своей задаче, ничего не происходило, когда ansible использовал python3, даже такие простые вещи, как "echo test> / tmp / testfile".
Дополнение: я использую ansible 2.3.1.0, установленный через пакет deb с http://ppa.launchpad.net/ansible/ansible/ubuntu
Итак, есть плагин действия wait_for_connection, который будет ждать, пока система снова станет доступной, и проверяет это, выполняя сквозной тест. Это более надежно, чем тестирование, если порт снова отвечает.
Мы работаем над новым плагином действия перезагрузки , который выполнит перезагрузку, будет ждать, пока соединение снова не начнет работать, и, наконец, проверяет, действительно ли была перезагружена система.
Копия @AnderEnder @gregswift @jarv @jhoekx
нажмите здесь, чтобы получить помощь по ботам
Целевая система - CentOS 7.4
- name: restart server
become: yes
shell: sleep 2 && /sbin/shutdown -r now "System reboot"
#command: /usr/bin/systemd-run --on-active=10 /usr/bin/systemctl reboot
async: 1
poll: 0
- name: waiting 10 secs for server to come back
become: false
local_action: wait_for host={{ ansible_default_ipv4.address }} port={{ ansible_port }} state=started delay=10 timeout=120
@peterwillcn IMO Лучше использовать wait_for_connection вместо wait_for , см. http://docs.ansible.com/ansible/latest/wait_for_connection_module.html
Это не только проще, но и работает через прокси-серверы или прокси, используя тот же транспорт, который Ansible использует для целевого узла.
@dagwieers, как
Нашел пару ролей, которые позаботятся об этом:
@afeld, эта роль отлично выглядит.
Итак, моя проблема со всеми примерами, которые я видел, заключается в том, что все они зависят от некоторого случайного времени ожидания перед запуском опроса, чтобы увидеть, доступен ли порт ssh. Теперь, учитывая, что разным хостам требуется разное время для завершения процессов в зависимости от того, что они делают - это либо означает, что вам нужно установить длительную задержку, чтобы поймать худшего нарушителя, либо вы рискуете получить ложные срабатывания.
Новый wait_for_connection просто использует пинг и другой фактор случайной задержки (см. Выше). Так что снова огромный риск ложных срабатываний (подтверждено службой поддержки redhat).
Я сделал это немного более надежным, используя 2 задачи - первая ожидает отсутствия порта ssh - это запускается немедленно и имеет максимальное ожидание 15 минут, опросы каждую секунду - это должно быть достаточно времени для завершения серверных процессов и означает, что вам нужно только дождаться остановки обычных служб ОС.
Второй ssh не работает. Запускается задача 2 - ожидание состояния порта ssh - запускается с задержкой в 1 минуту.
Обратите внимание, что порт wait_for не полагается на ssh, он использует сокет python, чтобы определить, работает ли порт.
Энди
отправлено из моего Айфона
12 декабря 2017 года в 05:41 Шон Смайли [email protected] написал:
@afeld, эта роль отлично выглядит.
-
Вы получили это, потому что оставили комментарий.
Ответьте на это письмо напрямую, просмотрите его на GitHub или отключите обсуждение.
@akcrisp Проблема с вашей реализацией в том, что она не работает ни для чего, кроме простого wait_for_connection также использовался для этого, но он не работает для ssh_proxy или других прокси-транспортных соединений, поэтому нам пришлось его удалить.
Вы можете настроить время задержки для каждой системы / группы или других характеристик, но это не идеально.
Согласны, но не ясно, как исправить это без? Недетерминированная задержка в воздухе?
отправлено из моего Айфона
12 декабря 2017 года в 16:20 Даг Вирс написал на [email protected] :
@akcrisp Проблема с вашей реализацией в том, что она не работает ни для чего, кроме простого
-
Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub или отключите обсуждение.
Разве нельзя добавить проверку ssh в wait_for connection
Плюс добавьте grace_timeout что-то вроде того, что есть в AWS Autoscaling Groups - подождите еще некоторое время после того, как "соединение" будет установлено
это сработало для меня:
_ansible: 2.4.1.0
Ubuntu: 16.04.3 LTS
Linux 4.4.0-98-generic_
- name: reboot server
become: yes
shell: sleep 2 && /sbin/shutdown -r now "System reboot"
async: 1
poll: 0
- name: Wait for restart
local_action: wait_for port=22 host="{{ ansible_ssh_host | default(inventory_hostname) }}" search_regex=OpenSSH delay=60
- name: continue running script after reboot
shell: 'sh /home/ubuntu/my_script.sh'
Это сработало для меня на Ansible 2.4.2.0 и Ubuntu 16.04 LTS в Azure.
- hosts: all
become: yes
become_user: root
pre_tasks:
- name: Patching for Spectre and Meltdown followed by a reboot
become: yes
shell: nohup bash -c 'sleep 2 && apt -y update && apt -y upgrade && apt -y autoremove && reboot "System reboot"' &
async: 1
poll: 0
- name: Wait for 3 minutes for server to come online
become: false
local_action: wait_for port=22 host={{ ansible_ssh_host | default(inventory_hostname) }} search_regex='OpenSSH' delay=180 timeout=300
Думаю, мой вариант использования был намного сложнее. Вот мой, написанный как обработчик:
- name: Inform of reboot required
listen: reboot machine
debug:
msg: "System {{ inventory_hostname }} needs to be rebooted for changes to take effect"
- name: Update GRUB to pick up changes to default config, if any
command: update-grub2
listen: reboot machine
# Send the reboot command and let it run in the background
# so we can disconnect...
- name: Send reboot command
listen: reboot machine
shell: '(sleep 5; shutdown -r now) &'
- name: Clear host errors
listen: reboot machine
meta: clear_host_errors
failed_when: false
- name: Reset connection
listen: reboot machine
meta: reset_connection
failed_when: false
- name: Wait for SSH to be available
listen: reboot machine
local_action: wait_for
args:
host: "{{ ansible_host }}"
port: "{{ ansible_port | default('22') }}"
delay: 60
state: started
- name: Ansible ping
listen: reboot machine
local_action: ping
register: result
until: result.ping is defined and result.ping == 'pong'
retries: 30
delay: 10
- name: Run uptime
listen: reboot machine
command: uptime
# LACP and spanning-tree take a bit of time to start working
- name: Ping default gateway
listen: reboot machine
command: "ping -c 1 {{ ansible_default_ipv4.gateway }}"
register: result
until: result.rc == 0
retries: 30
delay: 10
Вот мое решение (Ansible 2.4.2):
- name: restart machine
shell: nohup sh -c '(sleep 5; shutdown -r now "Ansible restart") &' &>/dev/null
become: yes
- name: wait for machine to restart
wait_for_connection:
delay: 60
sleep: 5
timeout: 300
это сработало для меня:
- name: restart the system
shell: "sleep 5 & reboot"
async: 1
poll: 0
- name: wait for the system to reboot
wait_for_connection:
connect_timeout: 20
sleep: 5
delay: 5
timeout: 60
Все эти обходные пути интересны, но реальное исправление будет
Мы работаем над новым плагином действия перезагрузки, который выполнит перезагрузку, будет ждать, пока соединение снова не начнет работать, и, наконец, проверяет, действительно ли была перезагружена система.
Правильно? (с https://github.com/ansible/ansible/issues/14413#issuecomment-330523110)
Подтверждено.
с нетерпением жду этого
Мне интересно узнать, будет ли какой-либо модуль перезагрузки поддерживать различные варианты Unix, помимо Linux? Т.е. aix / Solaris и т.д., я полагаю, он работает с windows?
То, что я сделал в своем примере, и большинство, похоже, его упустили, заключается в том, что просто имея время ожидания для порта 22 - вполне возможно получить ложное срабатывание - если хосту требуется больше времени для завершения процессов, то есть подумайте о большой базе данных - чем фактор задержки, то он вполне может не перезагружаться - протестирован и доказал, что это может произойти - поэтому мой тест, чтобы убедиться, что ssh сначала отсутствует.
Энди
отправлено из моего Айфона
28 февраля 2018 года в 15:04 Даг Вирс [email protected] написал:
Подтверждено.
-
Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub или отключите обсуждение.
@akcrisp Таково намерение. Обсуждение было связано здесь раньше: https://github.com/ansible/ansible/issues/16186
---
- hosts: all
- name: restart the system
shell: "sleep 5 & reboot"
async: 1
poll: 0
- name: wait for the system to reboot
wait_for_connection:
connect_timeout: 20
sleep: 5
delay: 5
timeout: 60
ansible-playbook test.yaml
ОШИБКА! Синтаксическая ошибка при загрузке YAML.
значения сопоставления не разрешены в этом контексте
Ошибка, похоже, была в '/etc/ansible/test.yaml': строка 4, столбец 10, но может
быть в другом месте файла в зависимости от точной синтаксической проблемы.
Оскорбительная строка выглядит так:
Помогите, пожалуйста ;-)
---
- hosts: all
- name: restart the system
shell: "sleep 5 & reboot"
async: 1
poll: 0
- name: wait for the system to reboot
wait_for_connection:
connect_timeout: 20
sleep: 5
delay: 5
timeout: 60
Попробуй это.
Горе - я хочу, чтобы люди прочитали то, что я сделал. Каждый, кто просто ждет тайм-аута, рискует получить ложный результат. Для завершения работы приложению потребуется время, и оно будет думать, что ssh работает после перезагрузки. Я это проверил.
Вам гораздо лучше сначала проверить отсутствие ssh - это не зависит от shh - использует соединение сокета python
отправлено из моего Айфона
16 апреля 2018 года в 09:21 Бен Абинери написал на [email protected] :
- хосты: все
имя: перезапустить систему
оболочка: "сон 5 и перезагрузка"
асинхронный: 1
опрос: 0имя: дождитесь перезагрузки системы
wait_for_connection:
connect_timeout: 20
сон: 5
задержка: 5
тайм-аут: 60
Попробуй это.-
Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub или отключите обсуждение.
Вы правы - мой комментарий не был одобрением дизайна, я просто хотел продемонстрировать правильное форматирование.
Эта связанная ошибка, по-видимому, является причиной того, что задача асинхронной перезагрузки не запускается, как отмечалось ранее @pyroxde.
Итак, теперь у нас есть плагин reboot и win_reboot action для перезагрузки серверов Unix и Windows. Если у вас есть какие-либо проблемы с существующей реализацией, не стесняйтесь открывать новый выпуск с любыми подробностями.
Самый полезный комментарий
Также было бы неплохо обновить документы и / или статью поддержки для использования предпочтительного полного формата YAML для задач. Это работает для меня: