wait_for
v2.2
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
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.
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
Koneksi bersama
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]
Tuan rumah yang mungkin: macOS Sierra 10.12.4
target: Instans Fedora 25 di 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
- Anda juga dapat menempelkan tautan gist.github.com untuk file yang lebih besar
Target harus melakukan booting ulang dengan benar dan dapat melanjutkan buku pedoman.
Lihat keluaran di bawah ini dengan -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.
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:
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: 0name: 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
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.
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: