Pembaruan 2018
Mulai 2.3, Ansible sekarang hadir dengan wait_for_connection
modul, yang dapat digunakan tepat untuk tujuan ini.
#
## Reboot
#
- name: (reboot) Reboot triggered
command: /sbin/shutdown -r +1 "Ansible-triggered Reboot"
async: 0
poll: 0
- name: (reboot) Wait for server to restart
wait_for_connection:
delay: 75
Shutdown -r +1 mencegah pengembalian kode 1 untuk dikembalikan dan memungkinkan tugas gagal. Shutdown dijalankan sebagai tugas asinkron, jadi kita harus menunda wait_for_connection
tugas setidaknya 60 detik. 75 memberi kita penyangga untuk kotak kepingan salju tersebut.
wait_for_connection - Menunggu hingga sistem jarak jauh dapat dijangkau/digunakan
Paling andal yang saya dapatkan dengan 1.9.4 adalah (ini diperbarui, versi aslinya ada di bawah):
- name: Example ansible play that requires reboot
sudo: yes
gather_facts: no
hosts:
- myhosts
tasks:
- name: example task that requires reboot
yum: name=* state=latest
notify: reboot sequence
handlers:
- name: reboot sequence
changed_when: "true"
debug: msg='trigger machine reboot sequence'
notify:
- get current time
- reboot system
- waiting for server to come back
- verify a reboot was actually initiated
- name: get current time
command: /bin/date +%s
register: before_reboot
sudo: false
- name: reboot system
shell: sleep 2 && shutdown -r now "Ansible package updates triggered"
async: 1
poll: 0
ignore_errors: true
- name: waiting for server to come back
local_action: wait_for host={{ inventory_hostname }} state=started delay=30 timeout=220
sudo: false
- name: verify a reboot was actually initiated
# machine should have started after it has been rebooted
shell: (( `date +%s` - `awk -F . '{print $1}' /proc/uptime` > {{ before_reboot.stdout }} ))
sudo: false
Perhatikan async
pilihan. 1.8 dan 2.0 dapat hidup dengan 0
tetapi 1.9 menginginkannya 1
. Di atas juga memeriksa apakah mesin benar-benar telah di-boot ulang. Ini bagus karena pernah saya salah ketik yang gagal reboot dan tidak ada indikasi kegagalan.
Masalah besarnya adalah menunggu mesin menyala. Versi ini hanya duduk di sana selama 330 detik dan tidak pernah mencoba mengakses host sebelumnya. Beberapa jawaban lain menyarankan menggunakan port 22. Ini bagus jika keduanya benar:
- Anda memiliki akses langsung ke mesin
- mesin Anda dapat diakses segera setelah port 22 terbuka
Ini tidak selalu benar, jadi saya memutuskan untuk membuang waktu komputasi 5 menit.. Saya berharap dapat memperpanjang modul wait_for untuk benar-benar memeriksa status host agar tidak membuang waktu.
btw jawabannya menyarankan untuk menggunakan penangan itu bagus. Memberi +1 untuk penangan dari saya (dan saya memperbarui jawaban untuk menggunakan penangan).
Ini versi aslinya tetapi tidak begitu bagus dan tidak begitu dapat diandalkan:
- name: Reboot
sudo: yes
gather_facts: no
hosts:
- OSEv3:children
tasks:
- name: get current uptime
shell: cat /proc/uptime | awk -F . '{print $1}'
register: uptime
sudo: false
- name: reboot system
shell: sleep 2 && shutdown -r now "Ansible package updates triggered"
async: 1
poll: 0
ignore_errors: true
- name: waiting for server to come back
local_action: wait_for host={{ inventory_hostname }} state=started delay=30 timeout=300
sudo: false
- name: verify a reboot was actually initiated
# uptime after reboot should be smaller than before reboot
shell: (( `cat /proc/uptime | awk -F . '{print $1}'` < {{ uptime.stdout }} ))
sudo: false
Mungkin>=2.7 (dirilis pada Okt 2018)
Gunakan modul reboot bawaan:
- name: Wait for server to restart
reboot:
reboot_timeout: 3600
Mungkin <2.7
Mulai ulang sebagai tugas
- name: restart server
shell: 'sleep 1 && shutdown -r now "Reboot triggered by Ansible" && sleep 1'
async: 1
poll: 0
become: true
Ini menjalankan perintah shell sebagai tugas asinkron, jadi Ansible tidak akan menunggu akhir perintah. Biasanya async
param memberikan waktu maksimum untuk tugas tetapi sebagai poll
diatur ke 0, Ansible tidak akan pernah melakukan polling jika perintah telah selesai - ini akan membuat perintah ini menjadi "tembak dan lupakan". Tidur sebelum dan sesudah shutdown
adalah untuk mencegah terputusnya koneksi SSH selama restart saat Ansible masih terhubung ke host jarak jauh Anda.
Tunggu sebagai tugas
Anda bisa menggunakan:
- name: Wait for server to restart
local_action:
module: wait_for
host={{ inventory_hostname }}
port=22
delay=10
become: false
..tetapi Anda mungkin lebih suka menggunakan {{ ansible_ssh_host }}
variabel sebagai nama host dan/atau {{ ansible_ssh_port }}
sebagai host dan port SSH jika Anda menggunakan entri seperti:
hostname ansible_ssh_host=some.other.name.com ansible_ssh_port=2222
..dalam inventaris Anda (Kemungkinan hosts
berkas).
Ini akan menjalankan tugas wait_for pada mesin yang menjalankan Ansible. Tugas ini akan menunggu port 22 terbuka di host jarak jauh Anda, dimulai setelah penundaan 10 detik.
Mulai ulang dan tunggu sebagai penangan
Tapi saya menyarankan untuk menggunakan keduanya sebagai penangan, bukan tugas.
Ada 2 alasan utama untuk melakukan ini:
-
penggunaan kembali kode - Anda dapat menggunakan penangan untuk banyak tugas. Contoh: trigger server restart setelah mengubah zona waktu dan setelah mengubah kernel,
-
memicu hanya sekali - jika Anda menggunakan penangan untuk beberapa tugas, dan lebih dari 1 dari mereka akan membuat beberapa perubahan => memicu penangan, maka hal yang dilakukan penangan hanya akan terjadi sekali. Contoh: jika Anda memiliki penangan mulai ulang httpd yang dilampirkan ke perubahan konfigurasi httpd dan pembaruan sertifikat SSL, maka jika konfigurasi dan perubahan sertifikat SSL, httpd hanya akan dimulai ulang sekali.
Baca selengkapnya tentang penangan di sini.
Mulai ulang dan tunggu mulai ulang sebagai penangan:
handlers:
- name: Restart server
command: 'sleep 1 && shutdown -r now "Reboot triggered by Ansible" && sleep 1'
async: 1
poll: 0
ignore_errors: true
become: true
- name: Wait for server to restart
local_action:
module: wait_for
host={{ inventory_hostname }}
port=22
delay=10
become: false
..dan gunakan dalam tugas Anda secara berurutan, seperti ini, di sini dipasangkan dengan mem-boot ulang penangan server:
tasks:
- name: Set hostname
hostname: name=somename
notify:
- Restart server
- Wait for server to restart
Perhatikan bahwa penangan dijalankan dalam urutan yang ditentukan, bukan urutan yang tercantum dalam notify
!
Anda harus mengubah tugas wait_for untuk dijalankan sebagai local_action, dan menentukan host yang Anda tunggu. Misalnya:
- name: Wait for server to restart
local_action:
module: wait_for
host=192.168.50.4
port=22
delay=1
timeout=300