Allo stesso modo, se sono presenti aggiornamenti del kernel che richiedono il riavvio del sistema operativo, sarebbe meglio utilizzare il modulo reboot ansible per riavviare la macchina, attendere che si fermi, torni su e per rispondere ai comandi
In questa guida creeremo uno script per aggiornare la cache dei sistemi basati su Debian e aggiornare i pacchetti installati. Includeremo anche un'attività per riavviare il server se sono presenti aggiornamenti del kernel che richiedono il riavvio.
Controlla anche:
- SSH:generazione e utilizzo di chiavi ssh
Indice dei contenuti
- Utilizzo del modulo apt di Ansible per aggiornare tutti i pacchetti
- Riavvio del sistema se sono presenti aggiornamenti del kernel
- Creazione del file hosts
- L'intero playbook
- Esecuzione del playbook
1. Utilizzo del modulo apt di Ansible per aggiornare tutti i pacchetti
Prima di eseguire un aggiornamento del pacchetto nei sistemi basati su Debian, si consiglia sempre di eseguire un opportuno aggiornamento della cache. Questo può essere ottenuto usando questo comando:
sudo apt-get update
Possiamo ottenere lo stesso risultato utilizzando Ansible con questo compito:
- name: Update apt repo and cache on all Debian/Ubuntu boxes
apt:
update_cache: yes
force_apt_get: yes
cache_valid_time: 3600
Dove,
- update_cache:sì – Esegui l'equivalente di
apt-get update
comando su tutti i server - force_apt_get:sì – Non utilizzare il comando aptitude, utilizza invece il comando apt-get su Debian/Ubuntu box
- cache_valid_time:3600 – Aggiorna la cache apt se è precedente a
cache_valid_time
. Questa opzione è impostata in secondi. In questi esempi, è impostato su 3600 secondi.
Quindi eseguiamo l'aggiornamento. Normalmente eseguiamo questo comando apt-get per ottenere la funzione:
sudo apt-get upgrade -y
Questo è il compito di Ansible per ottenere l'aggiornamento:
- name: Upgrade all packages on servers
apt:
upgrade: dist
force_apt_get: yes
Dove,
- aggiornamento:dist – Esegui l'equivalente di
apt-get upgrade
comando su tutti i server Ubuntu o Debian Linux. In altre parole, aggiorna tutti i pacchetti all'ultima versione. - force_apt_get:sì – Usa apt-get invece di aptitude.
2. Riavviare il sistema se sono presenti aggiornamenti del kernel
Se sono presenti aggiornamenti del kernel, sarebbe necessario riavviare il sistema per applicare tali modifiche. Se è richiesto un riavvio, un file con questo percorso /var/run/reboot-required
verrà creato.
Quello che vorremmo fare è controllare se quel file esiste, quindi riavviare il sistema. Possiamo registrare una nuova variabile se il file /var/run/reboot-required esiste sul sistema usando 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
Dove:
- registra:file_required_riavvio – Il
register
la parola chiave decide in quale variabile salvare un risultato e la useremo come segue per riavviare la casella. - stat:percorso:/var/run/reboot-required – Determina se esiste un percorso (/var/run/reboot-required)
- get_md5:no – Algoritmo per determinare il checksum del file. In questo esempio, sto usando md5, ma puoi usare sha1, sha224, sha256, sha384 e sha512.
Ora che sappiamo se il server deve essere riavviato o meno, aggiungiamo un'attività per riavviare il server se il file esiste:
- 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
Dove,
- comando_test:tempo di attività – Eseguire il comando uptime sul server riavviato e aspettarsi il successo per determinare che la macchina è pronta per ulteriori attività.
- quando:reboot_required_file.stat.exists – Innanzitutto, verifica che il file denominato /var/run/reboot-required esista utilizzando una variabile denominata reboot_required_file. Il modulo di riavvio funzionerà solo se quel file esiste e viene applicato utilizzando la condizione Ansible "quando:reboot_required_file.stat.exists".
3. Creazione del file hosts
Ora che abbiamo la logica in atto, creiamo un file hosts.yaml. Salva questo contenuto in un file chiamato 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. L'intero playbook
Possiamo mettere l'intera logica in un playbook. Salva questo contenuto nel file 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. Esecuzione del playbook
Assicurati di configurare le chiavi ssh ed eseguirlo come segue:
ansible-playbook -i hosts.yaml upgrade.yaml -vv
Questo è l'output sul mio server
➜ 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
Conclusione
Hai imparato come aggiornare tutti i pacchetti sulle tue scatole Debian e Ubuntu Linux e riavviare il server, se necessario, usando i playbook Ansible.