Portál AbcLinuxu, 5. května 2025 15:10

Dotaz: Ansible - aktualizace Debian serverů

21.7.2019 11:29 Honza
Ansible - aktualizace Debian serverů
Přečteno: 746×
Odpovědět | Admin
Dobrý den.
Rád bych se zeptal, jestli tady není někdo, kdo denně používá Ansible pro automatickou správu a aktualizaci Debian / Ubuntu serverů. V podstatě řeším to, jak zajistit, aby když dojde k aktualizaci kernelu, tak aby se celý server zrestartoval. Ideální scénář je ten, že se spustí aktulizace kernelu na serveru A a jakmile aktualizace doběhne, tak se vyvolá reboot a počká se (třeba 10s) jestli server A nastartuje (stačí aby odpovídal na ping a běžel SSH). Pokud server A nastartuje, bude se pokračovat aktualizací serveru "B". Pokud by ale aktualizace na serveru A selhala, je potřeba aktualizace dalších serverů (do vyřešení problému) zastavit (FAIL).

Je toto vůbec řešitelné ?
Případne jak by to mohlo být řešitelné ?

A co se stane ve chvíli, kdy si aktualizace vyžádá nějaký uživatelský zásah (readline / ncurses) ?
Napadá mě Oracle MySQL, nebo tak něco...

Můj současný (jednoduchý playbook)
---

- name: run the playbook tasks on the hosts
  hosts: all
  tasks:

  - name: print out the hostname of target
    command: hostname

  - name: ensure aptitude is installed
    command: apt -y install aptitude

  - name: update the apt package index i.e. apt update
    apt: update_cache=yes

  - name: upgrade system packages i.e. apt upgrade
    apt: upgrade=yes
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

Věroš avatar 21.7.2019 18:22 Věroš | skóre: 24 | blog: Co není v hlavě | 49.29 s.š., 16.54. v.d.
Rozbalit Rozbalit vše Re: Ansible - aktualizace Debian serverů
Odpovědět | | Sbalit | Link | Blokovat | Admin
Pro restart je možné použít Ansible modul reboot, který počká, až restart doběhne a selže.

Debianu nemaje, na druhou půlku bohužel odpovědět nemůžu.
Školím Ansible
21.7.2019 20:16 Honza
Rozbalit Rozbalit vše Re: Ansible - aktualizace Debian serverů
Našel jsem...

toto: https://www.cyberciti.biz/faq/ansible-reboot-debian-ubuntu-linux-for-kernel-update-waitforit/
a taky toto: https://serverfault.com/questions/883314/show-updated-packages-with-ansible-package-management

....teď to bude chtít nějak slepit dohromady...

@Věroš - nemohl bych tu veřejně poprosit o pomoc ?
...hned by mi to školení od rootu (na které jsem již přihlášen) začalo dávat větší smysl ;-)
Díky,
Honza
Věroš avatar 23.7.2019 09:33 Věroš | skóre: 24 | blog: Co není v hlavě | 49.29 s.š., 16.54. v.d.
Rozbalit Rozbalit vše Re: Ansible - aktualizace Debian serverů
Omlouvám se, ale už já sem moc nechodím a tak to tady moc nečtu.

Na modulu reboot je pěkné to, že počká, až se server restartuje a není potřeba použít waitfor. Je to novinka z Ansible 2.6, do té doby se opravdu waitfor používal.

Pokud je potřeba spouštět aktualizace na serverech postupně, tak je možné použít modifikátor u playbooku serial: 1.

Školím Ansible
22.7.2019 09:24 NN
Rozbalit Rozbalit vše Re: Ansible - aktualizace Debian serverů
Odpovědět | | Sbalit | Link | Blokovat | Admin
Nekolik poznamek. Normalne ansible zpracovava hosty paralelene. Takze bych pouzil direktivu:
serial: 1
tak a by se servery zpracovavali jeden po druhem. Zadruhe bych pouzil direktivu:
any_errors_fatal: true
ktera zajisti, ze se pri selhani jedineho hosta cely proces zastavi.
22.7.2019 10:19 Honza nebo Petr, je to jedno
Rozbalit Rozbalit vše Re: Ansible - aktualizace Debian serverů
Děkuji NN za dobrou poznámku.
Zatím jsem to "naprasil" takto a zdá se, že funguje....
Ještě by bylo fajn, kdyby Ansible AWX odeslal notifikaci o tom, co všechno se aktualizovalo.
Zatím mi chodí jen standartní emaily z AWX.
---

- name: run the playbook tasks on the hosts
  hosts: all
  serial: 1
  any_errors_fatal: true
  tasks:

  - name: Print out the hostname of target
    command: hostname

  - name: Ensure aptitude and reboot-notifier are installed
    command: apt -y install aptitude python-apt reboot-notifier

  - name: Update the apt package index (apt update)
    apt: update_cache=yes

  - name: Upgrade system packages (apt upgrade)
    apt: upgrade=yes

  - name: List installed and updated packages
    shell: grep -E "^$(date +%Y-%m-%d).+ (install|upgrade) " /var/log/dpkg.log |cut -d " " -f 3-5
    register: result

  - name: Show Output
    debug: msg="{{ result.stdout_lines }}"

  - name: "Reboot server if kernel/libs updated and requested by the system"
    shell: sleep 2 && shutdown -r now 'Rebooting server to update system libs/kernel as needed' removes=/var/run/reboot-required
    become: true
    async: 1
    poll: 0
    ignore_errors: true

  - name: "Wait for system to become reachable again"
    local_action: wait_for host={{ ansible_default_ipv4.address }} port=22 delay=10 state=started
    become: false
22.7.2019 11:26 xxl | skóre: 26
Rozbalit Rozbalit vše Re: Ansible - aktualizace Debian serverů
22.7.2019 14:53 Honza nebo Petr, je to jedno
Rozbalit Rozbalit vše Re: Ansible - aktualizace Debian serverů
Už jsem to rozchodil, děkuju.
Věroš avatar 23.7.2019 09:43 Věroš | skóre: 24 | blog: Co není v hlavě | 49.29 s.š., 16.54. v.d.
Rozbalit Rozbalit vše Re: Ansible - aktualizace Debian serverů
AWX out-of-the-box je v notifikacích docela hloupý.

Pokud potřebuješ udělat notifikace chytřejší (třeba zobrazit, co se na strojích povedlo), tak je lepší z AWX použít buď webhook (místo e-mailu) a doprogramovat si k tomu webhooku serverovou část.

Pro ještě detailnější výpisy můžeš AWX požádat, ať posílá logy do nějakého syslog serveru a parsovat tam. Logování z AWX je docela pěkné.

Mám na to v produkci proof-of-concept, ale není to úplně hezky napsané a zveřejnitelné.

Miniaturní kód pro zpracování webhooku ( Flask + Errbot ), který posílá výstupy AWX do Errbota (Slack) je na gistu.

Dobře, zkusím to poslat jako talk na LinuxDays, ať se donutím ten ḱód učesat.
Školím Ansible
24.7.2019 10:54 Honza nebo Petr, je to jedno
Rozbalit Rozbalit vše Re: Ansible - aktualizace Debian serverů
Odpovědět | | Sbalit | Link | Blokovat | Admin
Dobrý den.
Ještě bych se zeptal, nevíte, jak je to s "wait_for_connection" po rebootu serveru, pakliže cílový host je za ssh tunelem ?
---
ansible_user: root
ansible_connection: ssh
ansible_ssh_common_args: '-o ProxyCommand="ssh -W %h:%p -q root@gw01.domain.com"'
Tohle bohužel v tomto případě nefunguje
  - name: "Reboot server if kernel/libs updated and requested by the system"
    shell: sleep 2 && shutdown -r now 'Rebooting server to update system libs/kernel as needed' removes=/var/run/reboot-required
    become: true
    async: 1
    poll: 0
    ignore_errors: true

  - name: "Wait for system to become reachable again"
    local_action: wait_for host={{ ansible_default_ipv4.address }} port=22 delay=10 state=started
    become: false
Nějaký nápad, jak to dělat / řešit ?
Pokud přistupuju na hosta napřímo, tak vše funguje OK a čeká se.
Problém je tedy pouze ve chvíli, kdy cílový host je za ssh tunelem / ssh_proxy_pass.
Věroš avatar 26.7.2019 10:46 Věroš | skóre: 24 | blog: Co není v hlavě | 49.29 s.š., 16.54. v.d.
Rozbalit Rozbalit vše Re: Ansible - aktualizace Debian serverů
Ještě jednou, použij pro reboot a čekání na reboot ansible akci reboot, podle zdrojového kódu by se měla vypořádat i ssh_proxy_pass.

Ověření necháme laskavému čtenáři za domácí úkol.
Školím Ansible
26.7.2019 14:36 xxl | skóre: 26
Rozbalit Rozbalit vše Re: Ansible - aktualizace Debian serverů
Nakonfiguruj si tu proxy v .ssh/config. A Ansiblu o tom vůbec neříkej.

Např.
ProxyCommand ssh -q muj_proxy_server nc -q0 muj_koncovy_server:12322
nebo třeba
ProxyJump root@muj_proxy_server:22
26.7.2019 04:52 Honza
Rozbalit Rozbalit vše Re: Ansible - aktualizace Debian serverů
Odpovědět | | Sbalit | Link | Blokovat | Admin
Nikdo ?
Nikdo nepoužívá, nikdo neřeší ?

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.