Nix en alternative à puppet/ansible

Pierre Gambarotto

Created: 2023-11-15 mer. 12:28

nix

  • langage
  • package manager
  • nixpkgs : collection de paquetages
  • nixos : OS linux bâti sur les précédents

installer nix

https://zero-to-nix.com/start/install

nix avec le support des flakes activé

curl --proto '=https' --tlsv1.2 -sSf -L \
  https://install.determinate.systems/nix \
  | sh -s -- install
# open new shell
nix --version
# lance nix-daemon
# qui répond aux commandes nix
# en réalisant des choses dans /nix/store

nix le langage

json + fonctions + template repl disponible

nix repl
nix-repl> pkgs = import <nixpkgs> {} # version on current system
nix-repl> s = "pour trouver curl, regarde dans ${pkgs.curl}"
nix-repl> s
"pour trouver curl, regarde dans /nix/store/yw7b9hfqivbkfnz36bjn3pi4x83d27m6-curl-8.1.1-bin"
nix-repl> find = name: "pour trouver ${name}, regarde dans ${pkgs.${name}}"
nix-repl> find "curl"
"pour trouver curl, regarde dans /nix/store/yw7b9hfqivbkfnz36bjn3pi4x83d27m6-curl-8.1.1-bin"
nix-repl> find "bash"
"pour trouver bash, regarde dans /nix/store/8fv91097mbh5049i9rglc73dx6kjg3qk-bash-5.2-p15"

nix : package manager avant tout

  • gère des paquetages dans /nix/store
  • un paquetage = une arborescence de fichiers
  • «installer» un paquetage : le rendre disponible par des liens dans le profil d’un utilisateur
  • profil d’un utilisateur : collection de liens vers des paquetages
  • le profile d’un utilisateur est rendu disponible par un lien dans son home

    ls -ld ~/.nix-profile
    lrwxrwxrwx - gamba 29 août   2022 /home/gamba/.nix-profile -> /nix/var/nix/profiles/per-user/gamba/profile
    

installer un paquetage

$ nix profile install nixpkgs#curl
$ which curl
~/.nix-profile/bin/curl
$ realpath $(which curl)
/nix/store/0g1lq3vff290wainxdlbz9a18m28pr4r-curl-8.4.0-bin/bin/curl

définir un environnemt shell

ouvrir un shell avec un ensemble d’outils disponibles

$ wg
command not found
$ traceroute
command not found
$ nix shell nixpkgs#wireguard-tools nixpkgs#traceroute
$ traceroute -V
Modern traceroute for Linux, version 2.1.3
Copyright (c) 2016  Dmitry Butskoy,   License: GPL v2 or any later
$ wg version
wireguard-tools v1.0.20210914 - https://git.zx2c4.com/wireguard-tools/
$ exit
$ wg
command not found

Quelques exemples :

nix trivial builders

  • nix pour générer un script
  • nix pour générer des fichiers de configuration
  • nix pour générer un environnement shell

flake : distribuer et réutiliser du code nix

https://plmlab.math.cnrs.fr/nix/bash-gitlab

nix profile install git+https://plmlab.math.cnrs.fr/nix/bash-gitlab
ls -l ~/.nix-profile/lib/bash/gitlabAPIBashLib
.r--r--r-- 4,9k root  1 janv.  1970 /home/gamba/.nix-profile/lib/bash/gitlabAPIBashLib
source ~/.nix-profile/lib/bash/gitlabAPIBashLib

slurm avec détection des drivers nvidia installés par une debian

https://plmlab.math.cnrs.fr/calcul/slrum-nvml

nix profile install git+https://plmlab.math.cnrs.fr/calcul/slurm-nvml#slurm-with-nvml
# very long
# binary cache needed !!
$ srun -V
slurm 21.08.8-2

overlay : modifier un paquetage existant

nix pour gérer un système

  • NixOS : idéal, mais pas le sujet
  • nix sur une distro étrangère

    on ne peut pas directement :

    • créer des utilisateurs
    • démarrer des services
    • copier des choses dans /etc (config, définition de services)

Principe général

pour utiliser nix sur un système non nixos en remplacement de puppet/ansible

flake, avec :

un script d’activation pour installer dans le système des choses définies dans le langage nix :

Utilisation (en mode développement)

  1. installer nix sur une distribution
  2. installer le script d’activation
  3. le faire tourner

Ou alors directement (config validée)

nix run git+https://plmlab.math.cnrs.fr/nix/nix-on-foreign

Récupérer du code de la configuration NixOS