Podobně, pokud existují aktualizace jádra, které vyžadují restart operačního systému, bylo by nejlepší použít modul reboot ansible k restartování počítače, počkat, až se vypne, vrátit se a reagovat na příkazy
V této příručce vytvoříme skript pro aktualizaci mezipaměti systémů založených na Debianu a nainstalovaných aktualizačních balíčků. Zahrneme také úlohu restartovat server, pokud existují aktualizace jádra, které vyžadují restart.
Zkontrolujte také:
- SSH – generování a práce s klíči ssh
Obsah
- Použití modulu Ansible apt k aktualizaci všech balíčků
- Restartování systému, pokud došlo k upgradům jádra
- Vytvoření souboru hostitelů
- Celou příručku
- Spuštění příručky
1. Pomocí modulu Ansible apt aktualizujte všechny balíčky
Před aktualizací balíčků v systémech založených na Debianu se vždy doporučuje provést aktualizaci mezipaměti apt. Toho lze dosáhnout pomocí tohoto příkazu:
sudo apt-get update
Toho můžeme dosáhnout pomocí Ansible s tímto úkolem:
- name: Update apt repo and cache on all Debian/Ubuntu boxes
apt:
update_cache: yes
force_apt_get: yes
cache_valid_time: 3600
Kde,
- update_cache:ano – Spusťte ekvivalent
apt-get update
příkaz na všech serverech - force_apt_get:ano – Nepoužívejte příkaz aptitude, místo toho použijte příkaz apt-get na krabicích Debian/Ubuntu
- cache_valid_time:3600 – Aktualizujte mezipaměť apt, pokud je starší než
cache_valid_time
. Tato možnost se nastavuje v sekundách. V těchto příkladech je nastavena na 3600 sekund.
Dále provedeme upgrade. Obvykle spouštíme tento příkaz apt-get, abychom dosáhli funkce:
sudo apt-get upgrade -y
Toto je úkol Ansible k dosažení upgradu:
- name: Upgrade all packages on servers
apt:
upgrade: dist
force_apt_get: yes
Kde,
- upgrade:dist – Spusťte ekvivalent
apt-get upgrade
příkaz na všech serverech Ubuntu nebo Debian Linux. Jinými slovy upgradujte všechny balíčky na nejnovější verzi. - force_apt_get:ano – Místo aptitude použijte apt-get.
2. Restartování systému, pokud existují aktualizace jádra
Pokud dojde k upgradům jádra, budeme muset restartovat systém, abychom tyto změny uplatnili. Pokud je vyžadován restart, soubor s touto cestou /var/run/reboot-required
bude vytvořen.
Co bychom chtěli udělat, je zkontrolovat, zda tento soubor existuje, a poté restartovat systém. Můžeme zaregistrovat novou proměnnou, pokud v systému existuje soubor /var/run/reboot-required pomocí ansible stat:
- name: Check if a reboot is needed on all servers register: reboot_required_file stat: path: /var/run/reboot-required get_md5: no
Kde:
- registrovat:reboot_required_file –
register
klíčové slovo rozhoduje o tom, do které proměnné se výsledek uloží, a my je použijeme k restartování boxu následovně. - stat:cesta:/var/run/reboot-required – Zjistěte, zda existuje cesta (/var/run/reboot-required)
- get_md5:ne – Algoritmus pro určení kontrolního součtu souboru. V tomto příkladu používám md5, ale můžete použít sha1, sha224, sha256, sha384 a sha512.
Nyní, když víme, zda má být server restartován nebo ne, přidejte úlohu pro restartování serveru, pokud soubor existuje:
- name: Reboot the server if kernel updated
reboot:
msg: "Reboot initiated by Ansible for kernel updates"
connect_timeout: 5
reboot_timeout: 300
pre_reboot_delay: 0
post_reboot_delay: 30
test_command: uptime
when: reboot_required_file.stat.exists
Kde,
- test_command:uptime – Proveďte příkaz uptime na restartovaném serveru a očekávejte úspěch od, abyste určili, že je počítač připraven na další úkoly.
- když:reboot_required_file.stat.exists – Nejprve zkontrolujte, zda existuje soubor s názvem /var/run/reboot-required pomocí proměnné s názvem reboot_required_file. Restartovací modul bude fungovat pouze v případě, že tento soubor existuje a je vynucen pomocí podmínky Ansible „when:reboot_required_file.stat.exists“.
3. Vytvoření souboru hosts
Nyní, když máme logiku na místě, pojďme vytvořit soubor hosts.yaml. Uložte tento obsah do souboru s názvem hosts.yaml
.
all:
hosts:
ubuntusrv:
ansible_ssh_host: 10.2.11.10
ansible_ssh_user: ubuntu
debiansrv:
ansible_ssh_host: 10.2.11.11
ansible_ssh_user: admin
children:
allservers:
hosts:
ubuntusrv:
debiansrv:
4. Celá příručka
Celou logiku můžeme dát do sešitu. Uložte tento obsah do souboru upgrade.yaml
---
- name: Playbook to Update cache, upgrade packages and reboot os if necessary
hosts: allservers
become: yes
gather_facts: False
tasks:
- name: Update apt repo and cache on all Debian/Ubuntu boxes
apt:
update_cache: yes
force_apt_get: yes
cache_valid_time: 3600
- name: Upgrade all packages on servers
apt:
upgrade: dist
force_apt_get: yes
- name: Check if a reboot is needed on all servers
register: reboot_required_file
stat:
path: /var/run/reboot-required
get_md5: no
- name: Reboot the server if kernel updated
reboot:
msg: "Reboot initiated by Ansible for kernel updates"
connect_timeout: 5
reboot_timeout: 300
pre_reboot_delay: 0
post_reboot_delay: 30
test_command: uptime
when: reboot_required_file.stat.exists
5. Spuštění příručky
Ujistěte se, že jste nastavili ssh klíče a spustili jej následovně:
ansible-playbook -i hosts.yaml upgrade.yaml -vv
Toto je výstup na mém serveru
➜ ansible-playbook -i hosts.yaml upgrade.yaml -vv
ansible-playbook [core 2.12.1]
config file = /Users/etowett/.ansible.cfg
configured module search path = ['/Users/etowett/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /Library/Python/3.8/site-packages/ansible
ansible collection location = /Users/etowett/.ansible/collections:/usr/share/ansible/collections
executable location = /usr/local/bin/ansible-playbook
python version = 3.8.2 (default, Apr 8 2021, 23:19:18) [Clang 12.0.5 (clang-1205.0.22.9)]
jinja version = 3.0.3
libyaml = True
Using /Users/etowett/.ansible.cfg as config file
[WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details
Skipping callback 'default', as we already have a stdout callback.
Skipping callback 'minimal', as we already have a stdout callback.
Skipping callback 'oneline', as we already have a stdout callback.
PLAYBOOK: upgrade.yaml ************************************************************************************************************************************************************
1 plays in upgrade.yaml
PLAY [Playbook to Update cache, upgrade packages and reboot os if necessary] ******************************************************************************************************
META: ran handlers
TASK [Update apt repo and cache on all Debian/Ubuntu boxes] ***********************************************************************************************************************
task path: /Users/etowett/Proj/me/infme/ansible/upgrade.yaml:7
changed: [ubuntusrv] => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"}, "cache_update_time": 1639737368, "cache_updated": true, "changed": true}
TASK [Upgrade all packages on servers] ********************************************************************************************************************************************
task path: /Users/etowett/Proj/me/infme/ansible/upgrade.yaml:13
ok: [ubuntusrv] => {"changed": false, "msg": "Reading package lists...\nBuilding dependency tree...\nReading state information...\nCalculating upgrade...\n0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.\n", "stderr": "", "stderr_lines": [], "stdout": "Reading package lists...\nBuilding dependency tree...\nReading state information...\nCalculating upgrade...\n0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.\n", "stdout_lines": ["Reading package lists...", "Building dependency tree...", "Reading state information...", "Calculating upgrade...", "0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded."]}
TASK [Check if a reboot is needed on all servers] *********************************************************************************************************************************
task path: /Users/etowett/Proj/me/infme/ansible/upgrade.yaml:18
ok: [ubuntusrv] => {"changed": false, "stat": {"atime": 1639737351.6237016, "attr_flags": "", "attributes": [], "block_size": 4096, "blocks": 8, "charset": "us-ascii", "checksum": "20f7959b87e8cd55b7c985e46d6fa38a4063037d", "ctime": 1639679787.0725238, "dev": 26, "device_type": 0, "executable": false, "exists": true, "gid": 0, "gr_name": "root", "inode": 1143, "isblk": false, "ischr": false, "isdir": false, "isfifo": false, "isgid": false, "islnk": false, "isreg": true, "issock": false, "isuid": false, "mimetype": "text/x-diff", "mode": "0644", "mtime": 1639679787.0725238, "nlink": 1, "path": "/var/run/reboot-required", "pw_name": "root", "readable": true, "rgrp": true, "roth": true, "rusr": true, "size": 32, "uid": 0, "version": null, "wgrp": false, "woth": false, "writeable": true, "wusr": true, "xgrp": false, "xoth": false, "xusr": false}}
TASK [Reboot the server if kernel updated] ****************************************************************************************************************************************
task path: /Users/etowett/Proj/me/infme/ansible/upgrade.yaml:24
changed: [ubuntusrv] => {"changed": true, "elapsed": 73, "rebooted": true}
META: ran handlers
META: ran handlers
PLAY RECAP ************************************************************************************************************************************************************************
ubuntusrv : ok=4 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Koneckonců
Naučili jste se, jak aktualizovat všechny balíčky na vašich linuxových boxech Debian a Ubuntu a v případě potřeby restartovat server pomocí Ansible playbooků.