tout savoir sur environnement nix

Tout savoir sur l’environnement Nix

Introduction

Il existe dans le monde Open Source un grand nombre de systèmes de packages, chacun voulant devenir le prochain standard.

Nix n’est pas qu’un simple gestionnaire de paquets, mais un environnement complet pour créer et manager vos serveurs GNU/Linux.

Il est composé d’un système de construction de package purement fonctionnel (Nix), d’une distribution Linux (NixOS) et d’outils DevOps (Nixops, Hydra, Nix-shell, Nix-container).

nix logo

Source : NixOs

Tout cet environnement est purement fonctionnel : c’est-à-dire que l’ensemble sera immuable. Le fonctionnel nous apporte son lot d’avantages, dont voici 3 effets intéressants :

1 – Le multi-versions

Vous pouvez avoir plusieurs versions (ou variantes) d’un package en même temps. C’est particulièrement intéressant lorsque différentes applications ont des dépendances sur différentes versions du même package.

En résumé : dites « Adieu » aux dépendances cassées !

2 – Le support du multi-utilisateurs

Chaque utilisateur possède son propre profil. Il peut ainsi installer et utiliser les packages qu’il désire, ce qui offre une parfaite autonomie.

3 – Le changement de version atomique

Chaque package peut être mis à jour indépendamment des autres et vous pouvez également faire un retour arrière.

nix-env --upgrade firefox 
# Je ne veux pas cette version.
nix-env --rollback
# Je retrouve ma version précédente.

Le packaging Nix/Nixpkgs

Le système du packaging est à la base de tout l’écosystème. Nix est un gestionnaire de paquets installable sur les distributions courantes, le tout par une simple commande.

alice@dri$ curl -L https://nixos.org/nix/install | sh

On peut alors utiliser toutes les fonctions d’installation :

alice@dri$ nix-env -i firefox

Ainsi que les profils :

alice@dri$ nix-env --list-generations 
1 2020-08-05 22:36:22
2 2020-08-05 22:37:26 (current)

Pratique pour les rollbacks !

La distribution NixOs

Au lieu d’utiliser une distribution avec un système Nix pour les packages, pourquoi ne pas installer toute une distribution basée sur Nix ?

C’est le pari de NixOS, qui vous offre un système immutable. N’essayez pas de modifier /etc/hosts à la main : ça ne marchera pas !

Vous générez un profil de votre système Linux à partir d’un fichier /etc/nixos/configuration.nix. Tout y est décrit : votre disposition du clavier, votre configuration réseau, la configuration de vos services (Apache, MySQL, etc).

Exemple : Je demande de la virtualisation Docker, VirtualBox et Libvirtd, en plus d’un service Redis (port non standard) et OpenSSH (avec configuration modifiée ).

Juste avec ces quelques lignes, tout sera installé, configuré et démarré :

virtualisation = {   
docker.enable = true;
libvirtd.enable = true;

virtualbox.host = {
enable = true;
enableHardening = true;
}
}

services = {
redis = {
enable = true;
bind = "0.0.0.0";
port = "2842";
package = pkgs.redis;
};

openssh = {
enable = true;
passwordAuthentication = false;
permitRootLogin = "no";
};
}

Si bien qu’il suffit de sauvegarder ce fichier dans un système de sources pour conserver la configuration de votre serveur.

Testons le profil :

alice@dri$ nixos-rebuild test

Si aucune erreur n’est relevée, on peut lancer un build et la bascule directe sur le nouveau profil :

alice@dri$ nixos-rebuild switch # execute un build , puis un switch

Cette gestion de profil est vraiment le point fort de la distribution. Si vous cassez votre système (ce qui est un fait rare déjà), on revient sur le précédent, soit en ligne de commande et dans le pire des cas : reboot, grub, choix du profil, fin de l’incident.

alice@dri$ nix-env --list-generations --profile /nix/var/nix/profiles/system
54 2020-08-06 14:39:30 current

L’outillage Devops

Nix-shell : gérer ses environnements

Un véritable must-have !

Imaginez que vous développiez une application et qu’un de vos collègues vienne vous aider. Il faut alors qu’il prépare son environnement : installer le compilateur/interpréteur, une base de données, ou d’autres applicatifs. Cela peut lui prendre un moment, la matinée peut-être !

Souhaite-t-il tout installer sur son ordinateur pour quelques jours ? Pas sûr ! Et s’il travaille sur un autre projet, avec des versions de compilateurs/base de données différentes de vous ?

Avec Nix-shell, il va créer son environnement en une seule commande.

Petit exemple en ligne de commande : A-t-il gcc ?

bob@dri$ gcc 
The program 'gcc' is currently not installed[...]

Avec Nix-shell, votre collègue a gcc et dans la version qu’il désire !

bob@dri$ nix-shell -p gcc5 

[nix-shell:~]$ cc --version
gcc (GCC) 5.4.0

La version 5 … c’est vieux. On passe en 6 ?

bob@dri$ nix-shell -p gcc6

[nix-shell:~]$ cc --version
gcc (GCC) 6.4.0

Quand vous rentrez dans un Nix-shell, vous entrez dans un environnement temporaire, avec des outils qui ne seront pas installés en dur dans votre système.

Nous vous entendons dire : et Docker ? Ok, Docker va construire des services, mais il n’installera pas la bonne version du langage et les librairies pour développer.

Avec Nix-shell, vous évitez ainsi d’installer des dizaines d’outils sur votre système.

Dans un de nos side-projects, notre fichier default.nix (lu par Nix-shell) nous permet d’obtenir les librairies Python (dont Flask), deux bases de données (Redis et Postgresql), de lancer des commandes pour l’initialisation. Tout est prêt en une commande !

Extrait :

with import  {}; 
let
py = pkgs.python37;
in
stdenv.mkDerivation rec {
name = "python-environment";

buildInputs = [
py
py.pkgs.flask
py.pkgs.requests
py.pkgs.flask_script py.pkgs.flask-restful py.pkgs.flask
py.pkgs.pip py.pkgs.psycopg2 py.pkgs.pyopenssl
py.pkgs.pika py.pkgs.pylint py.pkgs.redis
redis
postgresql
openssl
rabbitmq-server
];
shellHook = ''
# réduction pour lecture : Des variables définies mais
l'essentiel est gardé redis-server redis/redis.conf --port
${REDIS_PORT} --pidfile /tmp/redis.pid & rabbitmq-server
-detached
pg_ctl start -l $LOG_PATH -o "-c listen_addresses=localhost -c unix_socket_directories=$PGHOST"
'';
}

Note : le jour où nous voulons passer en python 3.8, nous n’avons qu’une modification à faire … vous l’avez trouvée ?

NixOps : automatiser vos serveurs

Aujourd’hui, il est indispensable de gérer à distance et d’automatiser la configuration des serveurs. NixOps est LA réponse dans l’écosystème Nix.

Fichier de configuration :

apache = {     
deployment.targetHost = "192.168.0.1";
imports = [ ./apache/configuration.nix
];
};
network.description = "lan";

Commande de déploiement :

nixops deploy -dapache   

NixOps reprend les grands principes du « purement fonctionnel » et supporte les déploiements aussi bien sur Virtualbox que sur AWS ou GCE.

Il est possible d’ajouter des données partagées entre différents serveurs, comme des numéros de ports, logins ou des mots de passe.

Demande de devis Syloé

Hydra : l’intégration continue

Celui qui développe aujourd’hui sans intégration continue … devrait nous contacter rapidement !

Hydra est un outil de test d’intégration continue et de version logicielle, basé sur Nix. Les tâches de construction sont décrites à l’aide d’expressions Nix. Cela permet à une tâche de génération Hydra de spécifier toutes les dépendances nécessaires pour générer ou tester un projet. Il prend en charge un certain nombre de systèmes d’exploitation, tels que GNU / Linux, Mac OS X et Windows.

Les Nix-containers

Oui, Docker s’est imposé dans le monde du conteneur, mais comme toute solution, il a ses défauts.

Nix-container est un conteneur sous la forme d’un mini-NixOs : il a sa propre adresse IP, mais aussi plusieurs services (ce qui n’est jamais facile sous Docker).

Exemple de déclaration :

containers.redisConsul = {     
privateNetwork = true;
hostAddress = "192.168.100.10";
localAddress = "192.168.100.11";
config = { config, pkgs, ... }: {
services.redis = {
enable = true;
bind = "0.0.0.0";
port = 6379;
package = pkgs.redis;
};
consul = {
enable = true;
webUI = false;
extraConfig = {
datacenter = "dri_syloe";
};
};
networking.firewall = {
enable = true;
allowedTCPPorts = [ 6379 8500 8600 ];
allowPing = false ;
};
};
};

Et comme toujours, il suffit de sauvegarder le fichier de déclaration pour distribuer le service.

Conclusion

Nous venons de faire un tour général de l’environnement Nix. Le principal frein à sa mise en place est son changement complet de philosophie pour les sysadmins et la reprise du Legacy. C’est pourtant une très bonne porte d’entrée à l’Infrastructure As Code : tout est orienté et géré par du code.

Se faire accompagner par des experts

Vous souhaitez mettre en place un processus Devops au sein de votre entreprise et vous avez besoin d’un accompagnement sur-mesure ? Les experts Syloé sont là pour vous conseiller et vous accompagner à mettre en place une approche Devops, vous permettant en autre d’automatiser vos déploiements, améliorer votre productivité et le travail en équipe.

Pour en savoir plus sur notre offre d’accompagnement Devops, contactez l’un de nos experts.

Partage

Commentaire sur "Tout savoir sur l’environnement Nix"

  1. molotov

    Trop touffu…je vois déjà passer 4 heures à trouver la doc pour décrire l’installation. En fait pour utiliser Nix, faut être un gars qui fait partie de l’équipe Nix. Les exemples montrés ne sont pas du tout intuitifs pour un sysadmin.

    Genre cette partie :

    with import {};
    let
    py = pkgs.python37;
    in
    stdenv.mkDerivation rec {
    name = « python-environment »;

    C’est imbitable, voire du foutage de gueule. Nix, ça me fait penser à Gentoo…c’était à la mode et puis plus personne n’utilise cet OS.

Laisser un commentaire

Inscrivez-vous à la newsletter Syloé !

Recevez gratuitement les analyses de nos experts