Ansible: Reboot dan Tunggu

Dibuat pada 10 Feb 2016  ·  58Komentar  ·  Sumber: ansible/ansible

JENIS MASALAH
  • Laporan Bug
NAMA KOMPONEN

wait_for

VERSI ANSIBLE

v2.2

RINGKASAN

Hai,

Saya memiliki yang di bawah ini sebagai bagian dari playbok saya untuk memutakhirkan semua paket sistem, mem-boot ulang mesin dan menunggu hingga mesin kembali. Playbook yang mungkin keluar saat mesin melakukan boot ulang dan tidak menunggu host kembali online dan menjalankan playbook yang tersisa. Bisakah Anda memberi saran?

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

Reboot berfungsi tetapi playbook yang tidak dapat digunakan kehilangan koneksi seperti yang ditunjukkan dengan kesalahan di atas.

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

Beri tahu saya jika ada detail yang diperlukan. Terima kasih.

Terima kasih,
Govind

affects_2.2 affects_2.3 bug module core

Komentar yang paling membantu

Pembaruan dokumen dan / atau artikel dukungan untuk menggunakan format YAML lengkap yang disukai untuk tugas juga akan menyenangkan. Ini bekerja untuk saya:

    - 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

Semua 58 komentar

tambahkan && sleep 1

shell: /sbin/shutdown -r now "Ansible system package upgraded" && sleep 1

sebagai solusi untuk menghindari koneksi terputus sebelum Ansible dapat 'menuai' file temp dan menutup koneksi.

Sekadar info, ini didokumentasikan di https://support.ansible.com/hc/en-us/articles/201958037-Reboot-a-server-and-wait-for-it-to-come-back meskipun tidak dipertahankan di dokumen repo ini, dan tidak muncul di docs.ansible.com

@bcoca Ditambahkan seperti yang Anda katakan tetapi masih mengalami kesalahan yang sama. Saya harus menggunakan ignore_errors: true untuk melewati kesalahan itu.

  • name: reboot sistem saat paket diupgrade
    perintah: / sbin / shutdown -r sekarang "Paket sistem yang memungkinkan ditingkatkan" && sleep 1
    kapan: latest_state.changed
    ignore_errors: true
    tag: upgrade_packages_all

Kesalahan:
fatal: [96.119.246.13]: GAGAL! => {"berubah": false, "gagal": true, "module_stderr": "", "module_stdout": "Daemon PolicyKit terputus dari bus.r \ nKami bukan lagi agen otentikasi terdaftar.r \ n", "msg": "MODULE FAILURE", "parsed": false}

Saya memiliki masalah yang sama dengan 2.0.0.2, solusi ini membantu saya:

- name: Wait for server come back
  wait_for: >
    host="{{ inventory_hostname }}"
    port=22
    delay=15
    timeout=60
  delegate_to: localhost

@ gvenka8c :

Anda mungkin ingin mencoba:

shell: sleep 2 && /sbin/shutdown -r now

@andyh itu berhasil !! :) terima kasih! Solusi akhir di Ansible 2.1 yang berfungsi adalah sebagai berikut

- 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 apakah solusinya masih berfungsi untuk Anda? Saya menggunakan 2.1.1.0 dan mendapatkan yang berikut:
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}

Saya menemukan jawaban ini yang memecahkan masalah untuk saya: 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 setelah reboot shell selalu melompati saya. Mengintip keluaran -vvv hanya menunjukkan bahwa itu dilewati karena bersyarat. Ada lagi yang mengalami ini? Saya dapat membuka tiket baru jika tampaknya tidak terkait.

Saya dapat mengonfirmasi bahwa ini benar-benar rusak pada 2.1 di instalasi kami. Kami membuatnya bekerja pada 1.9 dengan cara "1.9", meningkatkan Ansible ke 2.1, memodifikasi tugas ke cara "2.1", dan selalu rusak.

Solusi ini berfungsi dengan pemasangan saya. Namun, local_action menunggu seluruh waktu tunggu setiap saat: host saya dapat memulai ulang dalam ~ 30 detik, tetapi jika saya menyetel batas waktu wait_for ke 3600, Ansible akan menunggu satu jam sebelum melanjutkan dengan pedoman. .. Karena beberapa reboot mungkin lebih lama dari yang lain (pembaruan), saya benar-benar perlu memiliki waktu tunggu yang tinggi, tetapi tidak mampu membuang-buang waktu 15 menit agar tuan rumah saya kembali (terjadi 5 kali di buku pedoman utama saya :()

Setelah sedikit trial and error dengan berbagai solusi yang diposting untuk berbagai versi, berikut ini berfungsi untuk saya di 2.1.2 dengan guest VM Ubuntu 16.04 dan host OS X menggunakan Vagrant (1.8.6) dan 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 : Tidak yakin apakah ini berlaku untuk apa yang Anda coba lakukan, tetapi tugas kedua ini akan melakukan polling setiap 10 detik (default) setelah penundaan 10 detik untuk melihat apakah port 22 pada mesin tamu terbuka sebelum melanjutkan yaitu menang tidak mengambil nilai batas waktu yang dialokasikan penuh.

Pembaruan dokumen dan / atau artikel dukungan untuk menggunakan format YAML lengkap yang disukai untuk tugas juga akan menyenangkan. Ini bekerja untuk saya:

    - 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

Saya menulis sesuatu yang lain untuk menguji ini. Alih-alih menunggu tuan rumah bangun, saya ingin menunggu sampai tuan rumah turun.

    - 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

Jika saya mengerti dengan baik, ini akan mengumpulkan port 22 dari target saya setiap detik dan hanya akan berlanjut jika ditutup. Saya mematikan mesin sendiri, tetapi Ansible macet selama 5 menit sekarang :(

@martineg yang berfungsi dengan baik! Sekarang termasuk dalam peran Galaxy jmcvetta.debian-upgrade-reboot .

Pada kemungkinan 2.2 ini tidak me-reboot komputer saya. Ini hanya mengatakan bahwa pekerjaan dimulai, dan kemudian menunggu 22 port. Tapi node tidak reboot!

Saya memiliki masalah yang sama dengan @sashgorokhov di Ubuntu 16.04 / ansible 2.2.1.0.

Cukup ucapkan "Oke" dan jangan reboot.
ok: [IP] => { "ansible_job_id": "575686775528.32762", "changed": false, "finished": 0, "results_file": "/root/.ansible_async/575686775528.32762", "started": 1 }

@NoahO mungkin cuplikan kode kecil ini dapat membantu Anda:

tasks:
    - shell: shutdown -r now

Ini hanya me-reboot node tanpa menunggu (dalam kasus saya, saya benar-benar tidak perlu menunggu untuk reboot)

@sashgorokhov sayangnya saya membutuhkannya untuk reboot,

Mencoba membuat ini berfungsi pada server Centos 7.3 dari workstation F25 dengan Ansible 2.2.1, tetapi tampaknya tidak berhasil. Ada solusi?
Pada titik ini saya dengan serius mempertimbangkan untuk membuat peran terpisah untuk tugas yang harus saya jalankan setelah reboot dan memanggil 2 peran dari skrip shell dengan tidur yang cukup lama di antaranya atau jika saya ingin menjadi mewah, saya dapat menambahkan ssh-keyscan juga untuk memastikan server aktif .. Tapi lebih baik mengandalkan Ansible, Anda tahu, karena ini adalah alat otomatisasi yang nyata;)

EDIT:
Ok saya benar-benar idiot dan agak dekat dengan tengah malam di sini saya tidak takut untuk mengakuinya ... SALAH PERSEDIAAN SALAH. Bekerja! Maaf...

Memiliki masalah yang sama. Ada pembaruan tentang masalah ini? Sepertinya banyak orang menghadapi masalah ini

Ini masih menjadi masalah (Mac versi 2.3.0.0), targetnya adalah Instans Fedora di AWS. Tidak ada solusi di atas yang berhasil untuk saya (tidak akan error, tetapi juga tidak mem-boot ulang) jadi saya melakukan hal berikut (di mana delay_reboot hanyalah skrip shell, tidur dan 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
JENIS MASALAH

  • Laporan Bug
NAMA KOMPONEN


Koneksi bersama

VERSI ANSIBLE
- Tempelkan keluaran kata demi kata dari "ansible --version" di antara tanda kutip di bawah
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)]
KONFIGURASI
- Sebutkan pengaturan yang telah Anda ubah / tambahkan / hapus di ansible.cfg (atau menggunakan variabel lingkungan 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]
OS / LINGKUNGAN


Tuan rumah yang mungkin: macOS Sierra 10.12.4
target: Instans Fedora 25 di AWS.

RINGKASAN
- Jelaskan masalahnya secara singkat
LANGKAH UNTUK REPRODUKSI
- Untuk bug, tunjukkan dengan tepat cara mereproduksi masalah, menggunakan kasus uji minimal. Untuk fitur baru, tunjukkan bagaimana fitur tersebut akan digunakan.

- 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

- Anda juga dapat menempelkan tautan gist.github.com untuk file yang lebih besar

HASIL YANG DIHARAPKAN


Target harus melakukan booting ulang dengan benar dan dapat melanjutkan buku pedoman.

HASIL NYATA


Lihat keluaran di bawah ini dengan -vvv

- Tempel keluaran perintah verbatim di antara tanda kutip di bawah ini
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.

Terima kasih @ebalduf karena telah menyatukan semua ini! Saya juga dapat mengonfirmasi bahwa saya juga menghadapi masalah yang sama dengan 2.2.1 yang memungkinkan dengan MacOS / CentOS sebagai host yang memungkinkan dan CentOS7 sebagai host target. Alangkah baiknya jika bug ini bisa diprioritaskan!

Kode di bawah ini berfungsi untuk saya
Versi yang memungkinkan - 2.3
Server - Ubuntu 16.04.2 LTS

Sistem target - 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

Solusi yang diberikan oleh @sayantandas juga berhasil untuk kami.

Versi yang memungkinkan: 2.3.0.0
Versi server: CentOS Linux rilis 7.3.1611
Sistem target: CentOS Linux rilis 7.3.1611

Solusi yang diberikan oleh @sayantandas berfungsi untuk saya juga

Versi yang memungkinkan: 2.3.0.0
Versi server: RHEL 7.3
Sistem target: RHEL 7.3

Terima kasih

Ansible 2.3, Centos7, di bawah ini adalah apa yang saya lakukan setelah saya melakukan sesuatu yang memperbarui kernel, menghindari 'menunggu host untuk boot' jika host tidak me-reboot.

  - 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

Tidak dapat melakukan boot ulang dengan benar, bahkan dengan pemeriksaan kewarasan.

Mungkin 2.2.2.0

Contoh playbook untuk 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

Hasil

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

Saya mengalami masalah yang sama. Saya menambahkan tugas 'jeda' selama 30 detik di antara shell: shutdown sekarang -r dan tugas wait_for. Sekarang semuanya bekerja secara konsisten. Saya juga memiliki ini sebagai penangan dengan mendengarkan, jadi mereka hanya berjalan saat dibutuhkan.

Saya memiliki masalah serupa ketika mencoba me-reboot host Ubuntu 16.04 kami dengan kemungkinan dikonfigurasi untuk menggunakan python3. Segera setelah saya menginstal python 2.7 pada host Ubuntu 16.04 (apt-get install python-minimal) dan dikonfigurasi agar dapat menggunakannya pada sistem jarak jauh, reboot berfungsi dengan baik.
Setiap kali saya menggunakan "async" dalam tugas saya, sebenarnya tidak ada yang terjadi ketika python3 dapat digunakan, bahkan hal-hal yang sangat mendasar seperti "echo test> / tmp / testfile" tidak terjadi.

Tambahan: Saya menggunakan ansible 2.3.1.0 yang diinstal melalui paket deb dari http://ppa.launchpad.net/ansible/ansible/ubuntu

Jadi, ada plugin tindakan wait_for_connection yang akan menunggu hingga sistem tersedia kembali dan memvalidasi ini dengan melakukan pengujian ujung ke ujung. Ini lebih dapat diandalkan daripada menguji jika port merespons lagi.

Kami sedang mengerjakan plugin aksi reboot baru yang akan melakukan reboot, akan menunggu koneksi mulai bekerja lagi dan terakhir memeriksa apakah sistem benar-benar di-boot ulang.

cc @Ander @gregift @jarv @jhoekx
klik di sini untuk bantuan bot

Sistem target - 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 Sebaiknya gunakan wait_for_connection daripada wait_for , lihat: http://docs.ansible.com/ansible/latest/wait_for_connection_module.html

Ini tidak hanya lebih mudah, ini juga bekerja melalui jumphost atau proxy, menggunakan transport yang sama persis dengan yang digunakan Ansible untuk node target.

@dagwieers bagaimana plugin aksi reboot datang?

Menemukan beberapa peran di luar sana untuk menangani ini:

@afeld peran itu tampak hebat.

Jadi masalah saya dengan semua contoh yang telah saya lihat adalah bahwa semuanya bergantung pada beberapa waktu tunggu acak sebelum memulai jajak pendapat untuk melihat apakah port ssh tersedia. Sekarang, mengingat host yang berbeda membutuhkan jumlah waktu yang berbeda untuk mematikan proses tergantung pada apa yang dilakukannya - itu berarti Anda harus menetapkan penundaan yang lama untuk menangkap pelaku terburuk atau Anda mengambil risiko positif palsu.

Wait_for_connection baru hanya menggunakan ping dan faktor penundaan acak lainnya (lihat di atas). Jadi sekali lagi risiko besar dari positif palsu (dikonfirmasi oleh dukungan redhat).

Cara saya membuat ini sedikit lebih kuat adalah menggunakan 2 tugas - yang pertama menunggu port ssh tidak ada - ini segera dimulai dan memiliki waktu tunggu maksimum 15 menit, jajak pendapat setiap detik - ini seharusnya banyak waktu untuk proses server untuk dimatikan dan berarti Anda hanya perlu menunggu layanan os reguler berhenti.

Ssh kedua tidak berjalan Ini memulai tugas 2 - tunggu status port ssh - dimulai setelah penundaan 1 menit.

Perhatikan bahwa port wait_for tidak bergantung pada ssh, ia menggunakan soket python untuk menentukan apakah port sudah aktif

Andy

dikirim dari iPhone saya

Pada 12 Des 2017, pukul 05:41, Shaun Smiley [email protected] menulis:

@afeld peran itu tampak hebat.

-
Anda menerima ini karena Anda berkomentar.
Balas email ini secara langsung, lihat di GitHub, atau nonaktifkan utasnya.

@akcrisp Dan masalah dengan implementasi Anda adalah bahwa ia gagal untuk apa pun kecuali kasus penggunaan koneksi langsung yang sederhana. Modul wait_for_connection digunakan untuk melakukan ini juga, tetapi gagal untuk ssh_proxy, atau koneksi transport yang diproksikan lainnya, jadi kami harus menghapusnya.

Anda dapat membuat waktu tunda dapat dikonfigurasi per sistem / grup atau karakteristik lain, tetapi itu tidak ideal.

Setuju tetapi tidak jelas bagaimana Anda memperbaikinya tanpa? Tidak ada jari deterministik di penundaan acak udara?

dikirim dari iPhone saya

Pada 12 Des 2017, pukul 16:20, Dag Wieers [email protected] menulis:

@akcrisp Dan masalah dengan implementasi Anda adalah bahwa ia gagal untuk apa pun kecuali kasus penggunaan koneksi langsung yang sederhana. Modul wait_for_connection digunakan untuk melakukan ini juga, tetapi gagal untuk ssh_proxy, atau koneksi transport yang diproksikan lainnya, jadi kami harus menghapusnya.

-
Anda menerima ini karena Anda disebutkan.
Balas email ini secara langsung, lihat di GitHub, atau nonaktifkan utasnya.

Bukankah mungkin menambahkan cek ssh ke wait_for connection
Selain itu, tambahkan grace_timeout seperti di AWS Autoscaling Groups - tunggu beberapa saat lagi setelah "koneksi" dibuat

ini bekerja dengan baik untuk saya:
_dapat: 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'

Ini berfungsi untuk saya di Ansible 2.4.2.0 dan Ubuntu 16.04 LTS di 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

Saya kira kasus penggunaan saya jauh lebih kompleks. Ini milik saya yang ditulis sebagai pawang:

- 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

Inilah solusi saya (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

ini berhasil untuk saya:

- 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

Semua solusi ini menarik, tetapi perbaikan sebenarnya adalah

Kami sedang mengerjakan plugin aksi reboot baru yang akan melakukan reboot, akan menunggu koneksi mulai bekerja lagi dan terakhir memeriksa apakah sistem benar-benar di-boot ulang.

Baik? (dari https://github.com/ansible/ansible/issues/14413#issuecomment-330523110)

Dikonfirmasi.

menantikannya

Saya tertarik untuk mengetahui apakah ada modul reboot yang akan mendukung berbagai varian Unix selain Linux? Yaitu aix / Solaris dll, saya berasumsi ini berfungsi dengan windows?

Poin yang saya buat dengan contoh saya dan sebagian besar tampaknya telah melewatkannya - adalah bahwa dengan hanya memiliki waktu menunggu port 22 - sangat mungkin untuk mendapatkan positif palsu - jika sebuah host membutuhkan waktu lebih lama untuk mematikan proses, yaitu berpikir database besar - daripada faktor penundaan maka mungkin saja tidak benar-benar reboot - diuji dan membuktikan ini bisa terjadi - maka pengujian saya untuk memastikan ssh tidak ada terlebih dahulu.

Andy

dikirim dari iPhone saya

Pada 28 Feb 2018, pada 15:04, Dag Wieers [email protected] menulis:

Dikonfirmasi.

-
Anda menerima ini karena Anda disebutkan.
Balas email ini secara langsung, lihat di GitHub, atau nonaktifkan utasnya.

@akrisp Itu maksudnya. Diskusi tersebut ditautkan di sini sebelumnya: 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

tes pedoman yang mungkin.yaml
KESALAHAN! Kesalahan Sintaks saat memuat YAML.
nilai pemetaan tidak diperbolehkan dalam konteks ini

Kesalahan tampaknya ada di '/etc/ansible/test.yaml': baris 4, kolom 10, tetapi mungkin
berada di tempat lain dalam file tergantung pada masalah sintaks yang tepat.

Garis yang menyinggung tampaknya adalah:

  • nama: restart sistem
    shell: "sleep 5 & reboot"
    ^ di sini

tolonglah ;-)

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

Coba ini.

Duka - Saya berharap orang membaca apa yang telah saya lakukan. Setiap orang yang hanya menunggu waktu tunggu berisiko mendapatkan hasil positif palsu. Hanya perlu waktu lama untuk mematikan aplikasi dan akan mengira ssh sudah aktif setelah reboot. Saya sudah mengujinya.

Anda jauh lebih baik memeriksa ssh tidak ada terlebih dahulu - yang tidak bergantung pada shh - menggunakan koneksi soket python

dikirim dari iPhone saya

Pada 16 Apr 2018, pada 09:21, Ben Abineri [email protected] menulis:


  • host: semua
  • nama: restart sistem
    shell: "sleep 5 & reboot"
    asinkron: 1
    polling: 0

  • name: tunggu sistem melakukan boot ulang
    wait_for_connection:
    connect_timeout: 20
    tidur: 5
    penundaan: 5
    batas waktu: 60
    Coba ini.

-
Anda menerima ini karena Anda disebutkan.
Balas email ini secara langsung, lihat di GitHub, atau nonaktifkan utasnya.

Anda benar - komentar saya bukanlah pengesahan desain, saya hanya ingin mendemonstrasikan pemformatan yang benar.

Bug terkait ini tampaknya menjadi penyebab tugas booting ulang asinkron gagal dijalankan seperti yang disebutkan @pyroxde sebelumnya

37941

Jadi sekarang kita memiliki plugin aksi reboot dan win_reboot untuk me-reboot server Unix dan Windows. Jika Anda memiliki masalah apa pun dengan penerapan yang ada, jangan ragu untuk membuka masalah baru dengan detail apa pun.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat