GNU/Linux >> Znalost Linux >  >> Linux

Jak čekat na restart serveru pomocí Ansible?

Aktualizace pro rok 2018

Od 2.3 se Ansible nyní dodává s wait_for_connection modul, který lze použít přesně k tomuto účelu.

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

Vypnutí -r +1 zabrání návratu návratového kódu 1 a případnému selhání úlohy. Vypnutí je spuštěno jako asynchronní úloha, takže musíme zpozdit wait_for_connection úkol alespoň 60 sekund. 75 nám poskytuje vyrovnávací paměť pro případy sněhových vloček.

wait_for_connection - Čeká, dokud nebude vzdálený systém dosažitelný/použitelný


Nejspolehlivější, kterou mám s 1.9.4, je (toto je aktualizované, původní verze je dole):

- 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

Všimněte si async volba. 1.8 a 2.0 mohou fungovat s 0 ale 1.9 to chce 1 . Výše uvedené také kontroluje, zda byl počítač skutečně restartován. To je dobře, protože jednou jsem měl překlep, který selhal při restartu a žádné známky selhání.

Velkým problémem je čekání, až bude stroj v provozu. Tato verze tam prostě sedí 330 sekund a nikdy se nepokusí o přístup k hostiteli dříve. Některé další odpovědi naznačují použití portu 22. To je dobré, pokud platí obě:

  • máte přímý přístup ke strojům
  • váš počítač je přístupný ihned po otevření portu 22

Tyto nejsou vždy pravdivé, takže jsem se rozhodl ztrácet 5 minut výpočetního času. Doufám, že bude možné rozšířit modul wait_for, aby skutečně kontroloval stav hostitele, aby se zabránilo plýtvání časem.

btw odpověď navrhující použití handlerů je pěkná. +1 pro obslužné nástroje ode mě (a aktualizoval jsem odpověď, abych používal obslužné nástroje).

Zde je původní verze, ale není tak dobrá a není tak spolehlivá:

- 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

Ansible>=2.7 (vydáno v říjnu 2018)

Použijte vestavěný modul pro restart:

- name: Wait for server to restart
  reboot:
    reboot_timeout: 3600

Ansible <2,7

Restartovat jako úkol

- name: restart server
  shell: 'sleep 1 && shutdown -r now "Reboot triggered by Ansible" && sleep 1'
  async: 1
  poll: 0
  become: true

Tím se příkaz shell spustí jako asynchronní úloha, takže Ansible nebude čekat na konec příkazu. Obvykle async param udává maximální čas pro úlohu, ale jako poll je nastavena na 0, Ansible se nikdy nebude dotazovat, zda příkaz skončil - učiní tento příkaz "vypal a zapomeň". Spí před a po shutdown mají zabránit přerušení připojení SSH během restartu, když je Ansible stále připojen k vašemu vzdálenému hostiteli.

Počkejte jako úkol

Můžete použít:

- name: Wait for server to restart
  local_action:
    module: wait_for
      host={{ inventory_hostname }}
      port=22
      delay=10
    become: false

..ale můžete raději použít {{ ansible_ssh_host }} proměnnou jako název hostitele a/nebo {{ ansible_ssh_port }} jako hostitele a portu SSH, pokud použijete položky jako:

hostname         ansible_ssh_host=some.other.name.com ansible_ssh_port=2222 

..ve vašem inventáři (Ansible hosts soubor).

Tím se spustí úloha wait_for na počítači se systémem Ansible. Tato úloha počká na otevření portu 22 na vašem vzdáleném hostiteli, počínaje zpožděním 10 sekund.

Restartujte a počkejte jako manipulátoři

Navrhuji však použít obojí jako obslužné nástroje, nikoli úkoly.

Existují 2 hlavní důvody, proč to udělat:

  • opětovné použití kódu – handler můžete použít pro mnoho úkolů. Příklad: spustit restart serveru po změně časového pásma a po změně jádra,

  • trigger pouze jednou - pokud použijete handler pro pár úkolů a více než 1 z nich udělá nějakou změnu => spustí handler, pak se to, co handler udělá, stane pouze jednou. Příklad: pokud máte httpd restart handler připojený ke změně konfigurace httpd a aktualizaci certifikátu SSL, pak v případě změn konfigurace i certifikátu SSL bude httpd restartován pouze jednou.

Přečtěte si více o ovladačích zde.

Restartování a čekání na restart jako obsluha:

  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

..a použijte ji ve své úloze v sekvenci, jako je tato, zde spárovaná s restartováním obslužné rutiny serveru:

  tasks:
    - name: Set hostname
        hostname: name=somename
        notify:
          - Restart server
          - Wait for server to restart

Všimněte si, že obslužné nástroje se spouštějí v pořadí, v jakém jsou definovány, nikoli v pořadí, v jakém jsou uvedeny v notify !


Měli byste změnit úlohu wait_for tak, aby se spouštěla ​​jako local_action, a zadat hostitele, na kterého čekáte. Například:

- name: Wait for server to restart
  local_action:
    module: wait_for
      host=192.168.50.4
      port=22
      delay=1
      timeout=300

Linux
  1. Jak se připojit k SFTP pomocí FileZilla pro bezpečný přenos souborů

  2. Jak vytvořit uživatele Linuxu pomocí Ansible

  3. Jak používat Ansible k instalaci a konfiguraci Redis 6 na Ubuntu 20.04

  1. Jak aktualizovat/upgradovat Debian/Ubuntu Linux pomocí Ansible

  2. Jak SSH na server pomocí jiného serveru?

  3. Jak restartovat Linux pomocí příkazového řádku

  1. Jak používám Ansible a anacron pro automatizaci

  2. Jak odeslat řetězec na server pomocí s_client

  3. Příkaz Linuxu, který čeká na spuštění serveru SSH