Mettre à jour des milliers de servers linux en un clin d'oeil avec Ctfreak

jypelle

Jean-Yves Pellé

Posted on March 27, 2023

Mettre à jour des milliers de servers linux en un clin d'oeil avec Ctfreak

Vous cherchez à automatiser la mise à jour de vos serveurs sous linux ?

En lançant les mises à jour en parallèle ?

Sans devoir mettre en place une usine à gaz ?

Ne cherchez plus ce tuto est fait pour vous 😉.

Prérequis

  • 1000 serveurs à mettre à jour (par exemple) :
    • Ayant pour hostname serverXXXXX.local avec XXXXX allant de 00001 à 01000
    • Utilisant une distribution linux basée sur Debian (Debian, Ubuntu, Linux mint, ...)
    • Accessibles via SSH sur le port 22 avec la même clef privée et un compte utilisateur adminuser pouvant lancer des commandes sudo sans demande de mot de passe
  • Une instance de Ctfreak (vous verrez ça s'installe très bien : pas de dépendance, pas de bdd à configurer) avec un compte administrateur, la Free Edition suffira.

Le script

Sur chaque serveur, ce script shell permettra d'effectuer la mise à jour :

#!/bin/bash
export DEBIAN_FRONTEND=noninteractive
sudo apt update 
sudo apt upgrade -y -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold"
Enter fullscreen mode Exit fullscreen mode

On retrouve le classique apt update/upgrade enrichi de quelques éléments permettant de répondre automatiquement à toute question susceptible d'interrompre le script.

NB : Si vos serveurs sont sous Redhat (ou tout autre distribution basé sur RPM), je vous invite à adapter le script en conséquence.

Ctfreak

L'étape suivante sera d'utiliser ctfreak pour déployer et exécuter via SSH le script sur nos 1000 serveurs.

Connectez-vous à ctfreak avec votre compte administrateur.

Connection

Ajout de la clef SSH

Allez dans SSH Credential -> Bouton New SSH Credential

SSH credential

Ajoutez la clef privée SSH MySSHKey qui permet de se connecter aux serveurs et validez.

NB : Vous pouvez aussi vous connecter avec un mot de passe plutôt qu'une clef privée

Ajout des nodes

Un node désigne les paramètres de connexion à un serveur via SSH, les nodes sont regroupés en node sources.

Pour rappel, il y a 1000 serveurs, donc 1000 nodes à ajouter.

Il est bien sûr possible d'ajouter les nodes un par un via l'interface web, mais dans ce cas de figure, vous allez plutôt partir sur la création d'un node source dédié qui sera alimenté par un fichier yaml décrivant nos 1000 nodes.

Soit le fichier /home/adminuser/ctfreak-nodes.yaml (accessible en lecture par le user faisant tourner l'instance de ctfreak) :

- name: server0001
  tagNames:
    - debian_server
    - linux_server
  username: adminuser
  hostname: server0001.local
  osFamily: UNIX
  sshPort: 22

- name: server0002
  tagNames:
    - debian_server
    - linux_server
  username: adminuser
  hostname: server0002.local
  osFamily: UNIX
  sshPort: 22

## ...  
## Complétez avec les nodes 3 à 1000
## ...
Enter fullscreen mode Exit fullscreen mode

Allez dans Nodes -> Bouton New External Node Source

Connection

Vérifiez que la clef SSH MySSHKey est bien sélectionnée comme Credential (ctfreak s'en servira pour se connecter aux nodes via SSH),
puis validez pour créer le node source Linux Servers (ce dernier resynchronisera ses nodes à partir du fichier yaml toutes les 2 heures).

Si le fichier yaml a bien été reconnu, vous devriez voir la liste suivante :

Nodes

Ajout de la tâche

Allez dans Projects -> Bouton New Project

Project

Validez pour créer le projet Sysadmin.

Cliquez sur le bouton New Task.

Task

Validez pour créer la tâche Upgrade debian servers.

Cette tâche déploiera et exécutera le script shell :

  • sur tous les nodes correspondants au tag #debian_server
  • à chaque 1er jour du mois à 4h du matin

Exécution de la tâche

Pour éviter d'attendre le 1er du mois pour voir ce que ça donne 😉, exécutez la tâche en cliquant sur le bouton Execute.

Execution

L'exécution est lancée, cliquez alors sur l'identifiant d'exécution #T0ZJX pour consulter son avancement pour chaque node.

Une fois l'exécution terminée, il se peut que quelques nodes soient en échecs (timeout sur l'ouverture de connexion SSH, repo des packages indispo au lancement du apt-update, problème de DNS, ...) :

Execution nodes

Après avoir coché le filtre Failed only pour n'afficher que les nodes en échecs et consulter les logs pour fixer le souci (ici un problème de DNS),
vous pouvez lancer une nouvelle exécution pour retraiter uniquement les nodes en échecs via un simple clic sur Re-execute failed nodes.

Conclusion

Vous voilà avec un process fiable de mise à jour de vos serveurs.

Pour ceux qui voudraient aller plus loin, voici quelques suggestions d'amélioration :

  • Ajouter une notification par mail en cas d'échec de mise à jour.
  • Ajouter des serveurs Redhat:
    • Ajouter 1000 nouveaux nodes avec les tags redhat_server, linux_server.
    • Dupliquer la tâche Upgrade debian servers en Upgrade redhat servers et l'adapter en conséquence.
    • Créer une tâche Upgrade all servers de type workflow pour lancer en parallèle (PRO Edition) ou séquentiellement (FREE Edition) les tâches Upgrade debian servers et Upgrade redhat servers.
💖 💪 🙅 🚩
jypelle
Jean-Yves Pellé

Posted on March 27, 2023

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related