De même, s'il y a des mises à jour du noyau qui nécessitent un redémarrage du système d'exploitation, il serait préférable d'utiliser le module reboot ansible pour redémarrer la machine, attendre qu'elle s'arrête, se rallume et réponde aux commandes
Dans ce guide, nous allons créer un script pour mettre à jour le cache des systèmes basés sur Debian et mettre à niveau les packages installés. Nous inclurons également une tâche pour redémarrer le serveur si des mises à jour du noyau nécessitent un redémarrage.
Vérifiez également :
- SSH – Génération et utilisation des clés SSH
Table des matières
- Utilisation du module Ansible apt pour mettre à jour tous les packages
- Redémarrer le système s'il y a des mises à jour du noyau
- Création du fichier hosts
- Tout le livre de jeu
- Exécuter le playbook
1. Utilisation du module Ansible apt pour mettre à jour tous les packages
Avant d'effectuer une mise à niveau de paquet dans les systèmes basés sur Debian, il est toujours recommandé d'effectuer une actualisation du cache apt. Ceci peut être réalisé en utilisant cette commande :
sudo apt-get update
Nous pouvons obtenir la même chose en utilisant Ansible avec cette tâche :
- name: Update apt repo and cache on all Debian/Ubuntu boxes
apt:
update_cache: yes
force_apt_get: yes
cache_valid_time: 3600
Où,
- update_cache :oui – Exécutez l'équivalent de
apt-get update
commande sur tous les serveurs - force_apt_get :oui – N'utilisez pas la commande aptitude, utilisez plutôt la commande apt-get sur les boîtes Debian/Ubuntu
- cache_valid_time :3600 – Mettre à jour le cache apt s'il est plus ancien que le
cache_valid_time
. Cette option est définie en secondes. Dans ces exemples, il est défini sur 3600 secondes.
Ensuite, nous effectuons la mise à niveau. Nous exécutons normalement cette commande apt-get pour obtenir la fonction :
sudo apt-get upgrade -y
Voici la tâche Ansible pour réaliser la mise à niveau :
- name: Upgrade all packages on servers
apt:
upgrade: dist
force_apt_get: yes
Où,
- mise à niveau :dist – Exécutez l'équivalent de
apt-get upgrade
commande sur tous les serveurs Ubuntu ou Debian Linux. En d'autres termes, mettez à niveau tous les packages vers la dernière version. - force_apt_get :oui – Utilisez apt-get au lieu d'aptitude.
2. Redémarrer le système s'il y a des mises à jour du noyau
S'il y a des mises à niveau du noyau, nous aurions besoin de redémarrer le système pour appliquer ces modifications. Si un redémarrage est requis, un fichier avec ce chemin /var/run/reboot-required
sera créé.
Ce que nous voudrions faire, c'est vérifier si ce fichier existe, puis redémarrer le système. Nous pouvons enregistrer une nouvelle variable si le fichier /var/run/reboot-required existe sur le système en utilisant la statistique ansible :
- name: Check if a reboot is needed on all servers register: reboot_required_file stat: path: /var/run/reboot-required get_md5: no
Où :
- s'inscrire :reboot_required_file – Le
register
Le mot-clé décide dans quelle variable enregistrer un résultat et nous allons l'utiliser comme suit pour redémarrer la boîte. - stat :chemin :/var/run/reboot-required – Déterminer si un chemin (/var/run/reboot-required) existe
- get_md5 :non – Algorithme pour déterminer la somme de contrôle du fichier. Dans cet exemple, j'utilise md5, mais vous pouvez utiliser sha1, sha224, sha256, sha384 et sha512.
Maintenant que nous savons si le serveur doit être redémarré ou non, ajoutons une tâche pour redémarrer le serveur si le fichier existe :
- 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
Où,
- test_command :disponibilité – Exécutez la commande uptime sur le serveur redémarré et attendez le succès de pour déterminer que la machine est prête pour d'autres tâches.
- lorsque :reboot_required_file.stat.existe – Tout d'abord, vérifiez que le fichier nommé /var/run/reboot-required existe à l'aide d'une variable nommée reboot_required_file. Le module de redémarrage ne fonctionnera que si ce fichier existe et qu'il est appliqué à l'aide de la condition Ansible "when:reboot_required_file.stat.exists".
3. Création du fichier hosts
Maintenant que nous avons la logique en place, créons un fichier hosts.yaml. Enregistrez ce contenu dans un fichier appelé 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. Tout le playbook
Nous pouvons mettre toute la logique dans un playbook. Enregistrez ce contenu dans le fichier 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. Exécuter le playbook
Assurez-vous de configurer les clés SSH et de les exécuter comme suit :
ansible-playbook -i hosts.yaml upgrade.yaml -vv
Ceci est la sortie sur mon serveur
➜ 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
Conclusion
Vous avez appris à mettre à jour tous les packages sur vos machines Debian et Ubuntu Linux et à redémarrer le serveur si nécessaire à l'aide des playbooks Ansible.