Installation scriptée sur proxmox

salut, j’ai un serveur proxmox et je cherche le moyen de créer des vm NixOs configurée toute de la même manière avec un /etc/nixos qui serait sur un repos git …

J’ai regardé du côté de securix/bureautix mais ils sont lvl 100 niveau customisation et je comprend la moitié du quart de leur config .

pourriez vous me donner quelques pistes tuto/blog ou je pourrais m’inspirer ?

Merci pour votre aide

Je n’ai jamais utilisé proxmox directement mais tu as essayé NixOS + Proxmox: A Recipe for a Declarative Homelab · Josh Lee Creates ? Pour référence, ça semble assez simple : tu mets ta config dans un configuration.nix, tu créé une image VM proxmox avec:

$ nixos-generate -f proxmox -c configuration.nix

puis si tu mets à jour ta config tu peux la redéployer sur des serveurs déjà en route, par exemple via flake:

$ nixos-rebuild --flake .#flakeTarget --target-host user@remote-host --use-remote-sudo

Il donne pour config de départ ça (pour bien gérer le boot etc) :

{ config, pkgs, modulesPath, lib, system, ... }:

{
  imports = [
    (modulesPath + "/profiles/qemu-guest.nix")
  ];

  config = {
    #Provide a default hostname
    networking.hostName = lib.mkDefault "base";
    networking.useDHCP = lib.mkDefault true;
    
    # Enable QEMU Guest for Proxmox
    services.qemuGuest.enable = lib.mkDefault true;

    # Use the boot drive for grub
    boot.loader.grub.enable = lib.mkDefault true;
    boot.loader.grub.devices = [ "nodev" ];

    boot.growPartition = lib.mkDefault true;

    # Allow remote updates with flakes and non-root users
    nix.settings.trusted-users = [ "root" "@wheel" ];
    nix.settings.experimental-features = [ "nix-command" "flakes" ];

    # Enable mDNS for `hostname.local` addresses
    services.avahi.enable = true;
    services.avahi.nssmdns = true;
    services.avahi.publish = {
      enable = true;
      addresses = true;
    };

    # Some sane packages we need on every system
    environment.systemPackages = with pkgs; [
      vim  # for emergencies
      git # for pulling nix flakes
      python3 # for ansible
    ];

    # Don't ask for passwords
    security.sudo.wheelNeedsPassword = false;

    # Enable ssh
    services.openssh = {
      enable = true;
      settings.PasswordAuthentication = false;
      settings.KbdInteractiveAuthentication = false;
    };
    programs.ssh.startAgent = true;

    # Default filesystem
    fileSystems."/" = lib.mkDefault {
      device = "/dev/disk/by-label/nixos";
      autoResize = true;
      fsType = "ext4";
    };

    system.stateVersion = lib.mkDefault "24.05";
  };
}

Si tu as beaucoup de machines et si tu veux encore moins t’embéter pour le déploiement tu peux même configurer tes machines pour faire un pull d’un dépot git pour se mettre toutes seules à jour etc…

Hello,

flake est intéressant pour gérer plusieurs hôtes, ça te permet:

  • De déclarer tous les hôtes, avec partage des briques de config communes.
  • D’épingler les paquets, tu as un lockfile comme avec beaucoup de packages managers.

Voici un exemple basique de flake.nix, qui déclare deux hôtes (via une fonction mkHost):

{
  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
  };

  outputs = { self, nixpkgs, ... }:
    let
      system = "x86_64-linux";

      mkHost = hostName: nixpkgs.lib.nixosSystem {
        inherit system;
        modules = [
          ./modules/common.nix
          ./hosts/${hostName}/configuration.nix
        ];
      };
    in {
      nixosConfigurations = {
        alpha = mkHost "alpha";
        beta  = mkHost "beta";
      };
    };
}

Pour le build/déploiement des VM, tu peux le faire depuis ton poste à distance avec nixos-rebuild switch --flake .#alpha --target-host 192.168.1.xx

merci, ça ressemble à du Ansible dans la manière de faire :thinking:

ça force a avoir un poste NixOs qui se connecte en ssh sur le target pour les installer

Après quelques recherche, j’ai trouvé une solution à base de cloud-init

c’est aussi du Ansible vous allez me dire mais si j’ai bien compris, la vm est vierge au moment de l’install et il utilise cet ISO lors de l’install GitHub - AnarchoBooleanism/nixos-cloud-init-installer: A minimal NixOS flake with cloud-init designed for use as an installer ISO image for provisioning virtual machines · GitHub

C’est à dire ? Ça donne juste deux étapes : 1) tu créé une image de VM pour initialiser (il faut bien commencer à partir de quelque chose non?) 2) tu mets à jour tes machines, je vois pas comment on peut éviter ça (mais je connais très peu proxmox donc je dis peut-être une bétise ?). Quel est le workflow que tu souhaites ?

Et pour comparer avec ansible, l’un des gros avantages de NixOs par rapport à Ansible c’est que NixOs est vraiment pur et reproductible : tu supprimes un truc de ta config, c’est vraiment supprimé de l’OS, alors qu’avec Ansible tu peux facilement accumuler des choses qui ne sont pas supprimées mais n’apparaissent pas dans ta config, et ça rend le système non pur avec des risques de reproducibilité. D’ailleurs avec NixOs tu peux aussi localement lancer une VM, eg avec nixos-rebuild build-vm (ou équivalent flake) pour tester avant de déployer (c’est ptet évident pour toi, mais on sait jamais).

Je ne suis pas sûr de comprendre le soucis : la procédure créé une VM dans un premier temps (ici tu as besoin d’un poste avec Nix installé en effet, mais pas forcément sous NixOs), après tu peux créer une image presque vierge une fois dans ta vie (je peux te le faire si c’est vraiment un soucis mais faut me faire confiance, d’où l’intérêt de le faire soit même :-P) avec tes clés ssh pour y accéder et basta. Après j’imagine que proxmox te permet via une interface/api de créer de nouvelles VM à partir d’une image de base. Là tu donnes l’image créée durant la première étape. Et après tu souhaiteras certainement mettre à jour tes machines, d’où la dernière étape. Ici la machine qui envoit le code a besoin dans l’exemple d’avoir nix installé (ça évite de se taper à faire des scripts de deploy), mais si le but c’est vraiment d’éviter d’avoir nix installé sur la machine qui déploie (pourquoi ?), tu peux aussi imaginer faire un script qui copie le code à déployer via scp sur ta machine puis qui le déploie via ssh directement sur le serveur. Ou faire que chaque machine pull un dépot git régulièrement pour automatiquement se mettre à jour. Comme ça pour déployer même pas besoin de ssh, tu as juste besoin de faire un commit (tu peux même après t’amuser à n’autoriser que des commits signés, possiblement par plusieurs personnes etc si tu aimes la sécurité). Dis moi le workflow que tu veux je pourrai ptet t’aiguiller.

D’ailleurs pour les secrets tu seras ptet content d’utiliser sops-nix ou similaire (ça chiffre les secrets pour pas qu’ils apparaissent dans ton nix store, très pratique).

Ah oui là pour le coup c’est vraiment Ansible, plus une ressemblance. J’ai l’impression que ça utilise ansible pour déployer et installer une image Nix, et ça passe par l’API proxmox directement pour créer l’image. Après j’ai pas l’impression qu’Ansible soit vraiment nécessaire ici non (à part pour gagner un peu de temps), ils utilisent juste ansible comme un script bash pour communiquer avec l’API proxmox… Mais ça ne coute rien de l’utiliser non plus si tu trouves la pratique. Par contre tu te plains que dans la solution que je propose on a besoin de nix sur la machine qui installe, mais le lien que tu donnes en as encore plus besoin car ils lancent nix run github:nix-community/nixos-anywhere dans ta recette.

Comme indiqué dans mon premier post :

j’ai un serveur proxmox et je cherche le moyen de créer des vm NixOs configurée toute de la même manière avec un /etc/nixos qui serait sur un repos git …

Voici comment on aimerait procéder :

  1. On demande à notre admin proxmox une nouvelle vm
  2. il provisionne en resource cette vm, plug un ISO et démarre une install (Ubuntu server pour le moment)
  3. il me créé un user et me dit c’est bon tu peux t’y connecter
  4. En ssh, je prend la main et en suivant une procédure, j’install à la main tous les softs dont j’ai besoin + leurs config

comme tu peux te l’imaginer, on a rarement 2 fois la meme config. De plus, les machines ne sont pas mise à jour en meme temps. on doit s’y connecter les unes apres les autres pour réaliser les maintenances

On veut remplacer tout ça avec une solution à base de NixOS et voici à quoi nous devrions arriver:

  1. On demande à notre admin proxmox une nouvelle vm préconfigurer selon les fichiers .nix qui sont dans un repo git interne
  2. Il provisionne la machine en resource, plug l’iso et démarre l’installation selon nos fichiers .nix de notre repo (genre une commande à lancer et tout se fait tout seul mais si c’est en automatique c’est encore mieux)
  3. L’install est terminée et la machine est directement dans l’état attendu (config + soft)
  4. Si on modifie les fichiers de configuration des .nix dans notre repo git, toutes les machines installée selon cette procédure se mettent à jour toute seule… plus besoin de s’y connecter sauf pour rebooter la VM par exemple

Est-ce que je fantasme ou est-ce jouable avec NixOs?

Ahah les instructions du premier post n’étaient pas très claires, j’ai aussi des configs NixOs dans mon dépot git mais c’est pas du tout le même type de déploiement. Mais merci c’est bien plus clair maintenent.

Si comme tu le dis toutes tes machines suivent la même config, à mon avis le plus simple c’est de faire la chose suivante :

  1. Installer NixOS sur proxmox: on commence par mettre un NixOS dans proxmox, pour ça utilises le début du tuto que j’ai mis en haut pour créer une image d’une config très minimale (on fait ça une fois pour toute, en gros pour remplacer l’ISO ubuntu pour installer facilement NixOS, sinon on peut aussi passer par nixos-anywhere pour remplacer ubuntu par NixOs mais c’est plus galère) avec une petite modification : l’idée c’est juste d’avoir un truc qui boot, possiblement avec des clés ssh pour s’y connecter plus tard si besoin, et un module systemd qui va automatiquement chercher sa config depuis le dépot git qui t’intéresse. Donc pour résumer le plus simple est de copier la config plus haut et de rajouter le module existant autoUpgrade avec une config du type:

      system.autoUpgrade = {
          enable = "true";
          flake = "github:yourGitAccount/yourGitProject#baseConfig";
          # voir les autres options pour le configurer (e.g. fréquence de mise à jour (par défaut 1x par jour, 10mn c'est ptet plus raisonnable dans ton cas ?), s'il faut redémarrer et à quelle heure si mise à jour du noyau etc…) à l'adresse https://search.nixos.org/options?channel=25.11&query=system.autoUpgrade#show=option%253Asystem.autoUpgrade.dates
      };
    

    puis de créer ton image ISO via nixos-generate -f proxmox -c configuration.nix. Garde l’image générée et donne là à ton admin système, ça sera ton point de départ à la place de l’image ubuntu.

    Il faut bien comprendre que le module autoUpgrade n’est pas très compliqué : avec flake on installe une distribution complète à la place de la distribution actuelle avec un simple nixos-rebuild switch --flake github:myuser/myrepo#nameOfConfig et c’est exactement ce que fait ce module de manière périodique. Si tu veux simuler ce module à la main, tu peux donc juste taper cette commande pour redéployer une config sur la machine actuelle. Et tu peux créer toi même d’autres modules par exemple pour éviter le polling via des webhook github pour déployer plus rapidement, mais commençons simple. Tu peux aussi avoir plus d’info à cette adresse CI/CD rebuilds via github - #11 by tcurdt

  2. Mets ta config sur le dépot github: ensuite, il faut créer la vrai configuration à appliquer à tes systèmes. Pour ça, copie/colle la config de base de l’étape précédente (y compris le module autoUpgrade!) et rajoute les options que tu veux. Mets ça dans un flake.nix contenant:

    {
      inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.11";
      outputs = { self, nixpkgs }: {
        nixosConfigurations.baseConfig = nixpkgs.lib.nixosSystem {
          modules = [ ./configuration.nix ];
        };
      };
    }
    

    et mets ta config habituelle dans configuration.nix (tu peux aussi tout déplacer dans ton flake.nix si tu préfères, c’est pratique quand tu as plusieurs configs, par exemple j’ai souvent une config de test que je lance dans une vm comme expliqué plus haut et une config déployée). Mets la dans le dépot github pointé plus haut.

Et voila c’est tout ! Ta config sera automatiquement déployée de manière périodique suivant la config que tu as mise, et comme montré plus haut tu peux forcer un déploiement plus rapide via ssh/webhooks/… J’espère que ça aide !

1 Like

merci, je vais essayer de mettre ça en place dans les prochains jour