Mettre à jour des milliers de servers linux en un clin d'oeil avec Ctfreak
Tags: french, scheduling, sysadmin
Published: 2023-03-27 15:04:06

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](https://ctfreak.com) (vous verrez ça s'[installe](https://ctfreak.com/docs/install) 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 :

```bash
#!/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](https://ctfreak.com) pour déployer et exécuter via SSH le script sur nos 1000 serveurs.

Connectez-vous à ctfreak avec votre compte administrateur.

![Connection](https://pelle.link/fr/mettre-a-jour-des-milliers-de-serveurs-avec-ctfreak/connect.webp)

### Ajout de la clef SSH

Allez dans *SSH Credential* -> Bouton *New SSH Credential*

![SSH credential](https://pelle.link/fr/mettre-a-jour-des-milliers-de-serveurs-avec-ctfreak/sshkey.webp)

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) :

```yaml
- 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](https://pelle.link/fr/mettre-a-jour-des-milliers-de-serveurs-avec-ctfreak/node-source.webp)

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](https://pelle.link/fr/mettre-a-jour-des-milliers-de-serveurs-avec-ctfreak/nodes.webp)

### Ajout de la tâche

Allez dans *Projects* -> Bouton *New Project*

![Project](https://pelle.link/fr/mettre-a-jour-des-milliers-de-serveurs-avec-ctfreak/project.webp)

Validez pour créer le projet **Sysadmin**.

Cliquez sur le bouton *New Task*.

![Task](https://pelle.link/fr/mettre-a-jour-des-milliers-de-serveurs-avec-ctfreak/task.webp)

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](https://pelle.link/fr/mettre-a-jour-des-milliers-de-serveurs-avec-ctfreak/execution.webp)

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](https://pelle.link/fr/mettre-a-jour-des-milliers-de-serveurs-avec-ctfreak/execution-nodes.webp)

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