GNU/Linux >> Tutoriels Linux >  >> Linux

Comment j'ai utilisé Ansible pour automatiser les mises à jour à la maison

À la maison, je possède des appareils informatiques qui fonctionnent 24h/24 et 7j/7. Pour les tenir à jour et installer les mises à jour automatiquement, je laisse le travail à Ansible. Si vous êtes complètement nouveau sur Ansible, vous trouverez une bonne introduction dans :

  • Premiers pas avec Ansible
  • Démystifier Ansible pour les administrateurs système Linux
  • Guide de démarrage rapide d'Ansible pour les administrateurs système Linux

Mon réseau domestique comprend les appareils suivants :

  • Deux Raspberry Pi exécutant le système d'exploitation Raspbian
  • Mon hôte KVM exécutant Debian 10 Buster
  • Deux hôtes RHEL 8
  • Un Synology DS213air
  • Quatre hôtes RHEL sur un réseau isolé

L'hôte marqué par le carré rouge est mon nœud de contrôle Ansible. Son travail consiste à mettre à jour mon environnement Linux. Je l'ai choisi car cet hôte peut atteindre tous les autres hôtes de l'environnement. D'autres hôtes, par exemple les hôtes Red Hat Enterprise Linux 7 (RHEL)-Ansible, ne peuvent atteindre que les hôtes à l'intérieur du réseau isolé.

[ Vous pourriez également aimer : Comment créer un Playbook Ansible ]

Prérequis

Sur tous mes hôtes, il existe un compte utilisateur qui peut utiliser sudo pour exécuter des commandes avec les privilèges root. Pour plus de commodité, j'ai créé une paire de clés SSH et distribué la clé publique SSH aux hôtes que je souhaite mettre à jour à l'aide d'Ansible. Si vous avez besoin d'aide pour générer les clés SSH, consultez Utilisation de ssh-keygen et partage pour l'authentification basée sur les clés sous Linux par Tyler Carrigan.

Pour utiliser l'hôte RHEL8-Squid en tant que nœud de contrôle Ansible, je dois activer un référentiel qui fournit Ansible et l'installer :

$ sudo subscription-manager repos --enable=ansible-2.9-for-rhel-8-x86_64-rpms
$ sudo dnf -y install ansible

Pour les autres distributions, veuillez consulter la documentation officielle.

Le fichier de configuration par défaut d'Ansible se trouve dans /etc/ansible/ansible.cfg . Étant donné que ce fichier est livré et contrôlé par le package RPM, j'aime créer un fichier de configuration personnalisé à ~/.ansible.cfg en copiant simplement l'original et en le modifiant. Je n'ai apporté que quelques modifications :

$ egrep -v "^$|^#|^\[" ~/.ansible.cfg
inventory      = ~/ansible/hosts
private_key_file = /home/user/.ssh/ansible_id_rsa

Comme vous pouvez le voir, j'ai créé un ansible répertoire dans mon HOME répertoire pour stocker mon fichier d'inventaire de l'hôte. J'ai également spécifié le chemin d'accès à la clé privée SSH qu'Ansible doit utiliser pour se connecter aux nœuds du réseau.

Avec cette configuration, toute la magie est contrôlée depuis mon HOME répertoire, et je n'aurai pas besoin de privilèges root sur mon nœud de contrôle Ansible pour effectuer le travail suivant.

Créer un fichier d'inventaire statique

Dans ce cas d'utilisation, j'utilise un fichier d'inventaire statique en plaçant mes hôtes avec leur nom de domaine complet dans le ~/ansible/hosts fichier.

[special]
localhost
tower-pc.lan

[yum]
rhel7-ansible.private1
rhel7-t1.private1
rhel8-t1.private1
rpm-repo-r8.private1
podhost-r8-1.lan

[apt]
raspi-sht21.lan
pi-hole.lan

[ipkg]
diskstation.lan

Comme vous pouvez le voir, j'ai regroupé les hôtes de mon réseau par le gestionnaire de paquets qu'ils utilisent. Cela est pratique lors de la création du playbook pour les mettre à jour. Le groupe [spécial] contient mon nœud de contrôle Ansible lui-même et mon hyperviseur KVM, où mon nœud de contrôle Ansible s'exécute.

Pour plus d'informations sur l'inventaire d'Ansible, consultez :Comment créer votre inventaire.

Vérifier la connectivité

Avant de créer le playbook qui met à jour mes hôtes, je vérifie si mon nœud de contrôle Ansible RHEL8-Squid peut se connecter à tous mes hôtes en utilisant la commande ad-hoc suivante :

$ ansible all -m ping -T 30
rhel7-t1.private1 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
rhel7-ansible.private1 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
rpm-repo-r8.private1 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": false,
    "ping": "pong"
}
rhel8-t1.private1 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": false,
    "ping": "pong"
}
podhost-r8-1.lan | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": false,
    "ping": "pong"
}
[WARNING]: Platform linux on host tower-pc.lan is using the discovered Python
interpreter at /usr/bin/python, but future installation of another Python
interpreter could change this. See https://docs.ansible.com/ansible/2.9/referen
ce_appendices/interpreter_discovery.html for more information.
tower-pc.lan | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
[WARNING]: sftp transfer mechanism failed on [diskstation.lan]. Use
ANSIBLE_DEBUG=1 to see detailed information
[WARNING]: Platform linux on host diskstation.lan is using the discovered
Python interpreter at /usr/bin/python, but future installation of another
Python interpreter could change this. See https://docs.ansible.com/ansible/2.9/
reference_appendices/interpreter_discovery.html for more information.
diskstation.lan | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
[WARNING]: Platform linux on host pi-hole.lan is using the discovered Python
interpreter at /usr/bin/python, but future installation of another Python
interpreter could change this. See https://docs.ansible.com/ansible/2.9/referen
ce_appendices/interpreter_discovery.html for more information.
pi-hole.lan | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
[WARNING]: Platform linux on host raspi-sht21.lan is using the discovered
Python interpreter at /usr/bin/python, but future installation of another
Python interpreter could change this. See https://docs.ansible.com/ansible/2.9/
reference_appendices/interpreter_discovery.html for more information.
raspi-sht21.lan | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}

Le délai d'attente par défaut pour une connexion Ansible est de 10 secondes. Parce que mon Synology DiskStation est en mode veille la plupart du temps, j'utilise l'option -T pour spécifier un délai d'attente de 30 secondes pour lui donner le temps de se réveiller.

Les avertissements ne me dérangent pas pour le moment, alors je passe à la création du playbook.

Si vous souhaitez en savoir plus sur les commandes ad-hoc, lisez Introduction aux commandes ad-hoc dans la documentation officielle.

Le manuel de jeu

Mon playbook contient trois jeux. Chaque jeu exécute une tâche sur les hôtes appartenant à un certain groupe dans mon inventaire, sauf [spécial] . Dans cet exemple simple, chaque jeu se connecte à un groupe d'hôtes, les met à jour et les redémarre ensuite au cas où des mises à jour auraient été installées.

Pour déterminer si des mises à jour ont été installées, j'enregistre des variables qui stockent les valeurs de retour des tâches où je les ai enregistrées. Je les utilise pour vérifier si le statut d'une tâche a changé. Si c'est le cas, le système sera redémarré. Voici le manuel :

---
- hosts: yum
  tasks:
  - name: Update all installed packages using YUM module
    yum:
      name: '*'
      state: latest
      update_cache: yes
      update_only: yes
    register: yum_update_status

  - name: Remove packates not needed anymore
    yum:
      autoremove: yes

  - name: Reboot when packages were updated
    reboot:
    when: yum_update_status.changed

- hosts: apt
  tasks:
  - name: Update all installed packages using APT module
    apt:
      name: '*'
      state: latest
      update_cache: yes
      only_upgrade: yes
    register: apt_update_status

  - name: Remove packages not needed anymore
    apt:
      autoremove: yes

  - name: Reboot when packages were updated
    reboot:
      post_reboot_delay: 60
    when: apt_update_status.changed

- hosts: ipkg
  tasks:
  - name: Update the Packages installed on Diskstation
    command: /opt/bin/ipkg update && /opt/bin/ipkg upgrade

Comme vous l'avez peut-être remarqué, le Diskstation n'a pas été redémarré. En effet, seuls les outils de l'espace utilisateur seront mis à jour et il n'est pas nécessaire de redémarrer. Si une nouvelle version du système d'exploitation est disponible pour le Diskstation , je le mettrai à jour manuellement car il n'y a pas encore de module Ansible pour cela. C'est une histoire similaire avec les hôtes tower-pc.lan et rhel8-squid.lan . Je les ai laissés en dehors de ce livre de jeu exprès. Mon nœud de contrôle Ansible et mon hyperviseur KVM sont suffisamment importants pour moi pour que je les mette à jour manuellement.

Voici un aperçu de la première exécution du playbook :

$ ansible-playbook -T 30 -b --ask-become-pass pkg_update.yml
BECOME password:

PLAY [yum] **************************************************************************************************************************************

TASK [Gathering Facts] **************************************************************************************************************************
ok: [podhost-r8-1.lan]
ok: [rhel7-t1.private1]
ok: [rhel8-t1.private1]
ok: [rpm-repo-r8.private1]
ok: [rhel7-ansible.private1]

TASK [Update all installed packages using YUM module] *******************************************************************************************
ok: [rhel8-t1.private1]
ok: [podhost-r8-1.lan]
ok: [rpm-repo-r8.private1]
ok: [rhel7-t1.private1]
ok: [rhel7-ansible.private1]

TASK [Remove packates not needed anymore] *******************************************************************************************************
ok: [rhel7-t1.private1]
ok: [rhel7-ansible.private1]
ok: [rhel8-t1.private1]
ok: [podhost-r8-1.lan]
ok: [rpm-repo-r8.private1]

TASK [Reboot when packages were updated] ********************************************************************************************************
skipping: [rhel7-ansible.private1]
skipping: [rhel7-t1.private1]
skipping: [rhel8-t1.private1]
skipping: [rpm-repo-r8.private1]
skipping: [podhost-r8-1.lan]

PLAY [apt] **************************************************************************************************************************************

TASK [Gathering Facts] **************************************************************************************************************************
ok: [pi-hole.lan]
ok: [raspi-sht21.lan]

TASK [Update all installed packages using APT module] *******************************************************************************************
changed: [pi-hole.lan]
changed: [raspi-sht21.lan]

TASK [Remove packages not needed anymore] *******************************************************************************************************
ok: [pi-hole.lan]
ok: [raspi-sht21.lan]

TASK [Reboot when packages were updated] ********************************************************************************************************
changed: [pi-hole.lan]
changed: [raspi-sht21.lan]

PLAY [ipkg] *************************************************************************************************************************************

TASK [Gathering Facts] **************************************************************************************************************************
ok: [diskstation.lan]

TASK [Update the Packages installed on Diskstation] *********************************************************************************************
changed: [diskstation.lan]

PLAY RECAP **************************************************************************************************************************************
diskstation.lan            : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
pi-hole.lan                : ok=4    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
podhost-r8-1.lan           : ok=3    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   
raspi-sht21.lan            : ok=4    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
rhel7-ansible.private1     : ok=3    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   
rhel7-t1.private1          : ok=3    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   
rhel8-t1.private1          : ok=3    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   
rpm-repo-r8.private1       : ok=3    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   

Comme vous pouvez le voir, mes machines RHEL étaient déjà à jour. Rien à mettre à jour ou à supprimer, et donc aucun redémarrage requis. Mon Raspberry Pis, en revanche, avait des mises à jour disponibles et elles ont été installées. Les deux appareils ont ensuite été redémarrés. La diskstation a son état modifié , aussi. Mais sachez que c'est parce que j'utilise la command module, qui renvoie modifié chaque fois qu'il s'exécute, que quelque chose ait changé ou non sur votre nœud.

[ Un guide gratuit de Red Hat :5 étapes pour automatiser votre entreprise. ] 

Récapitulez

Dans cet article, je vous ai montré un exemple simple mais pas très sophistiqué de la façon dont je maintiens à jour mes appareils Linux à la maison en utilisant l'automatisation Ansible. Il vous montre comment utiliser les groupes de votre inventaire dans différentes parties de votre playbook en utilisant certains des modules Ansible et une simple commande.


Linux
  1. Comment créer un Playbook Ansible

  2. Comment ajouter plusieurs hôtes dans phpMyAdmin

  3. Comment installer Ansible sur Oracle Linux 8

  4. Comment strace doit-il être utilisé?

  5. comment créer un playbook Ansible pour obtenir les versions du système d'exploitation des hôtes distants ?

Comment installer Ansible sur Debian 9 (Stretch)

Comment installer Ansible sur Ubuntu 16.04 (Xenial)

Comment annuler une mise à jour Windows

Comment installer Ansible Server sur Ubuntu 18.04

Comment installer Ansible sur Linux Mint 20

Comment configurer un serveur domestique