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

31 octobre 2022
ctfreak scheduling sysadmin

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

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"

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
## ...

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 :

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 :