Os Immutable: Nixos
Nixos est une distribution Linux basée sur le gestionnaire de package fonctionnel Nix. Ce gestionnaire de packages peut être installé sur n’importe distribution Linux. Il permet d’utiliser plusieurs versions d’un même package en les installant dans des dossiers spécifiques, dont le nom est la somme de contrôle du paquet. Pour gérer les différents cas d’usage, il suffit de créer des fichiers de déclaration écrit dans le langage nix en y indiquant les dépendances nécessaires. Pour simplifier la gestion, Nix est livré avec toute une série d’utilitaires.
Pour le moment, je ne vais pas expliquer tout le fonctionnement de Nix, mais simplement montrer comment construire des images pour les instancier ensuite avec Terraform.
Installation du gestionnaire de package Nix
Pour pouvoir construire des images, il faut installer le gestionnaire de packages Nix sur votre poste de développement. Comme on ne va pas pour le moment l’utiliser sur ce poste, je l’installe en mode single-user.
L’outil d’installation se charge de créer les répertoires nécessaires à son fonctionnement et à ajouter la ligne de chargement du profil dans votre shell favori. Il faut juste ouvrir une nouvelle session pour la charger.
On va changer de version via les channels de nix. On vérifie quelle version on a pour le moment :
Unstable, pas cool, on change donc pour utiliser la version 21.11
:
Build d’une image Nixos pour kvm
Je ne vais pas utiliser nixos-generators
mais la commande nix-build
. Il faut
dans un premier temps créer la configuration nix de votre VM.
Déclaration de la configuration de la VM
On crée un premier fichier kvm-nixos.nix
avec ce contenu :
On importe le module permettant d’installer Nixos. On indique comment sera
construire l’image, taille du disque, son format et sa configuration via le
fichier nix machine-config.nix
dont le contenu est le suivant :
On importe le profil qemu-guest qui se charge de configurer l’OS pour qu’il
fonctionne sur notre hyperviseur. On crée la configuration de la machine
dans la variable config
. On peut tout décrire dedans depuis le partitionnement
des disques, jusqu’aux packages à intégrer, mais aussi les users et
groupes à créer, la configuration du clavier, etc. Nixos intégrant un
système de mise à jour automatique et que je veux rendre mon instance
immutable, je le désactive.
Pour rechercher les packages à installer vous pouvez utiliser la commande nix search <nom>
ou vous rendre sur le site nixos
search ↗.
Build de l’image
Maintenant tout est prêt. On peut lancer le build :
C’est assez rapide et donc plutôt une belle surprise. Vérifions que notre
fichier qcow2 est bien présent dans le dossier result
:
L’image est bien présente, mais c’est un lien qui pointe vers un dossier qui intègre la somme de contrôle de l’image. Quelle taille fait le fichier
Tout de même 2,4 Go. Allez on la teste !
Teste de l’image avec Terraform
Voici mon fichier de configuration permettant d’instancier une VM intégrant notre image générée :
Allez on instancie :
Test de l’image nixos
Normalement le serveur ssh est actif avec la clé de mon compte m’autorisant
à me connecter avec le compte admuser
:
Cool, c’est bien la version 21.11 et docker fonctionne. Maintenant essayons d’installer ansible :
C’est déjà bien pip s’installe. On doit modifier le PATH (faudra l’ajouter dans la config ):
Allez on lance l’installation d’Ansible :
Ça fonctionne plutôt bien, vu que j’ai ajouté tous les packages nécessaires
pour
que cryptography
se compile.
Plus loin
J’apprécie vraiment la partie définition de l’image via un script de
configuration, même si cela impose d’apprendre le langage nix. Par contre,
je trouve l’apprentissage un peu hard
, surtout que je n’ai pas cherché à
astreindre d’autres versions que celles définies dans la version fournie.
J’adore aussi la possibilité de tester des outils sans les installer via
nix-shell.
Je vais continuer à vérifier peut réellement être utilisé contexte de production
et qu’il est réellement immutable
.
Je pense qu’il est possible de définir une architecture complexe en utilisant les inventaires et les templates Ansible pour générer toutes les images et en faisant appel à terraform pour tout instancier.
Je pense que nixos
peut également être une base pour construire des images
Docker à utiliser dans les pipelines de CI/CD. Je suis sûr que nix-build
permet de le faire. Un prochain billet.
Source : nix.dev ↗