Ansible: Перезагрузитесь и дождитесь

Созданный на 10 февр. 2016  ·  58Комментарии  ·  Источник: ansible/ansible

ТИП ВЫПУСКА
  • Отчет об ошибке
КОМПОНЕНТ НАЗВАНИЕ

ждать

ДОСТУПНАЯ ВЕРСИЯ

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.

Сообщите мне, если требуются какие-либо подробности. Благодарю.

Благодаря,
Говинд

affects_2.2 affects_2.3 bug module core

Самый полезный комментарий

Также было бы неплохо обновить документы и / или статью поддержки для использования предпочтительного полного формата 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

Все 58 Комментарий

добавить && 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, чтобы пропустить эту ошибку.

  • имя: перезагрузить систему при обновлении пакета
    команда: / sbin / shutdown -r now «Системный пакет Ansible обновлен» && sleep 1
    когда: latest_state.changed
    ignore_errors: правда
    Теги: upgrade_packages_all

Ошибка:
фатальный: [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 --version» между кавычками ниже
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)]
КОНФИГУРАЦИЯ
- Упомяните любые настройки, которые вы изменили / добавили / удалили в ansible.cfg (или с помощью переменных среды ANSIBLE_ *).
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, который будет ждать, пока система снова станет доступной, и проверяет это, выполняя сквозной тест. Это более надежно, чем тестирование, если порт снова отвечает.

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

Целевая система - 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, но может
быть в другом месте файла в зависимости от точной синтаксической проблемы.

Оскорбительная строка выглядит так:

  • имя: перезапустить систему
    оболочка: "сон 5 и перезагрузка"
    ^ здесь

Помогите, пожалуйста ;-)

---
- 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.

37941

Итак, теперь у нас есть плагин reboot и win_reboot action для перезагрузки серверов Unix и Windows. Если у вас есть какие-либо проблемы с существующей реализацией, не стесняйтесь открывать новый выпуск с любыми подробностями.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги