| 22 Oct 2023 |
@victor_mignot:matrix.org | Bonjour ici ! Je suis entrain de tenter de faire une config NixOS sous forme de flake commune à toutes mes machines. Mon objectif ici est de passer par un ensemble de modules custom, et de définir les configs de machines quasi-exclusivement avec les options que ces modules déclarent. Comme j'ai pas envie de faire de modules spécifiques pour home-manager, et que j'aimerais que l'ensemble des informations pour une machine soit défini dans un seul et unique fichier, cela complique un peu la tâche (même fichier/module importé plusieurs fois pour définir la configuration). J'ai toutefois une jolie erreur quand j'essaie un petit nix flake check qui semble globalement dire qu'il n'arrive pas à récupérer l'option de mes modules custom lors de son ajout dans le paramètre modules de la fonctionnixosSystem. J'avoue que je me gratte la tête depuis quelques heures (ça m'étonnerait pas que ça soit lié à une erreur débile de ma part). Comme je n'ai pas d'autres utilisateurs de Nix dans mon entourage, si quelqu'un a quelques minutes à m'accorder pour me filer un coup de main, ça m'aiderait vraiment beaucoup !
Voici le lien du repo: https://git.sr.ht/~dala/nixos-flake-config
Trigger warning: j'ai assez peu d'expérience avec Nix et essaye juste de faire les choses selon la doc et ce que je comprends du code de nixpkgs. Il y a certainement des choses qui vont vous piquer les yeux (je prend vos retours si y'a moyen de faire les choses plus proprement). Merci d'avance !
| 15:52:22 |
Minijackson | hey, j'ai regardé un peu, et je pense avoir trouvé 2 soucis | 19:41:36 |
Minijackson | le principal, c'est que le concept des modules comme ceci sont des concepts de NixOS et pas du langage Nix:
{
imports = [ ... ];
options = ...;
config = ...;
}
| 19:42:22 |
Minijackson | du coup, si tu importe un fichier comme ceci avec un import comme fait dans ton flake.nix, ça va juste retourner un objet avec imports, options, et config, sans plus | 19:43:05 |
Minijackson | si tu veux utiliser un système d'option, il faut soit passer par une configuration NixOS (le plus simple), en évaluant tout par lib.nixosSystem) | 19:43:50 |
Minijackson | soit utiliser à la main lib.evalModules, mais il va falloir redéfinir des choses (comme par exemple les options assertions que tu utilises dans machines.nix) | 19:44:59 |
Minijackson | un autre soucis que j'ai vu (mais qui pose pas encore problème), c'est ce bout de code:
imports = if config.machineType == "workstation"
then [ ./workstation.nix ] else [ ./server.nix ];
| 19:45:40 |
Minijackson | ce code va causer une récursion infinie, puisque workstation.nix ou server.nix peuvent eux-même changer la valeur de machineType | 19:46:19 |
Minijackson | (interdit d'utiliser les valeurs de config pour les imports) | 19:46:47 |
@victor_mignot:matrix.org | Thanks pour la réponse sur mon problème actuel.
Pour le deuxième, j'ai donc pas le choix que de passer par un element externe à la config ? | 20:08:58 |
Minijackson | soit ça, soit d'utiliser le système de module à la place | 20:18:00 |
Minijackson | grace aux mkIf | 20:18:28 |
Minijackson | tu peux importer les deux fichiers, mais faire en sorte que la config soit appliqué comme ça: mkIf config.machineType == "workstation" { ... } | 20:19:10 |
Minijackson | il y a un peu de doc à ce sujet ici: https://nixos.org/manual/nixos/stable/#sec-option-definitions-delaying-conditionals | 20:21:01 |
@victor_mignot:matrix.org | Effectivement, my bad | 20:21:03 |
Minijackson | je me suis fait avoir plein de fois aussi x) | 20:21:31 |
@victor_mignot:matrix.org | Haha, je veux bien te croire | 20:21:47 |
@victor_mignot:matrix.org | Pour finir, quand tu dis "tout faire évaluer par nixosSystem", j'avoue que je saisis pas trop | 20:22:10 |
@victor_mignot:matrix.org | C'est ce que j'ai l'impression de faire, mais il faut croire que non du coup :') | 20:22:34 |
@victor_mignot:matrix.org | Ha, de trouver un moyen de mettre tous les modules custom définis directement dans les modules (sans chercher à les call à la mano) ? | 20:23:24 |
Minijackson | de ce que je vois, dans ton flake.nix tu as:
machines = (import ./configurations {}).machines;
| 20:23:53 |
@victor_mignot:matrix.org | Yup, c'est ce que je voulais dire par "les call à la mano" | 20:24:23 |
Minijackson | yes | 20:24:32 |
Minijackson | le import à la mano va ignorer l'attribut "options", puisque personne va le lire | 20:24:55 |
@victor_mignot:matrix.org | Effectivement, ça te retourne juste un set dans ce cas là. J'étais pas au courant que c'était pas une construction Nix de base. Après c'est logique vu que tous le code pour les interpreter est dans nixpkgs | 20:25:11 |
@victor_mignot:matrix.org | Donc je pourrais juste songer à faire un truc plus intelligent ou je règlerais plutôt les éléments à passer à modules par des mécanismes du genre, utiliser un fichier différent selon chaque machine (qui porterait son nom par exemple) | 20:27:20 |
Minijackson | je pense que c'est possible, oui | 20:28:12 |
@victor_mignot:matrix.org | Nickel, merci beaucoup pour l'aide, tu me sauve encore une fois haha | 20:28:35 |
Minijackson | pas de soucis ^^ | 20:28:45 |
Minijackson | hésite pas si tu veux plus d'infos | 20:28:58 |