GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana cara menunggu server restart menggunakan Ansible?

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

Linux
  1. Cara menggunakan Ansible untuk menginstal dan mengkonfigurasi Redis 6 di Ubuntu 20.04

  2. Cara Reboot Linux Menggunakan Command Line

  3. Cara mengirim string ke server menggunakan s_client

  1. Bagaimana saya menggunakan Ansible dan anacron untuk otomatisasi

  2. Cara membuat Pengguna Linux Menggunakan Ansible

  3. Cara memperbarui/meningkatkan Debian/Ubuntu Linux menggunakan Ansible

  1. Cara Menghubungkan ke SFTP Menggunakan FileZilla untuk Transfer File yang Aman

  2. Bagaimana Cara Ssh Ke Server Menggunakan Server Lain??

  3. Perintah Linux untuk menunggu server SSH aktif