{ description = "NixOS kubeadm cluster configs"; inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.05"; }; outputs = { nixpkgs, ... }: let system = "x86_64-linux"; lib = nixpkgs.lib; pkgs = nixpkgs.legacyPackages.${system}; nodeNames = [ "cp-1" "cp-2" "cp-3" "wk-1" "wk-2" "wk-3" ]; mkNode = { name, role, extraModules ? [ ], }: let roleModule = if role == "control-plane" then ./modules/k8s-control-plane.nix else ./modules/k8s-worker.nix; hardwarePath = ./hosts/hardware + "/${name}.nix"; in nixpkgs.lib.nixosSystem { inherit system; modules = [ ./modules/k8s-cluster-settings.nix ./modules/k8s-common.nix roleModule ({ lib, ... }: { imports = lib.optional (builtins.pathExists hardwarePath) hardwarePath; networking.hostName = name; system.stateVersion = "25.05"; boot.loader.grub.devices = lib.mkDefault [ "/dev/sda" ]; fileSystems."/" = lib.mkDefault { device = "/dev/disk/by-label/nixos"; fsType = "ext4"; }; }) ] ++ extraModules; }; mkNodeByName = name: mkNode { inherit name; role = if lib.hasPrefix "cp-" name then "control-plane" else "worker"; }; mkEvalCheck = name: let cfg = mkNode { inherit name; role = if lib.hasPrefix "cp-" name then "control-plane" else "worker"; extraModules = [ ({ lib, ... }: { boot.loader.grub.devices = lib.mkDefault [ "/dev/sda" ]; fileSystems."/" = lib.mkDefault { device = "/dev/disk/by-label/nixos"; fsType = "ext4"; }; }) ]; }; in pkgs.runCommand "eval-${name}" { } '' cat > "$out" <<'EOF' host=${cfg.config.networking.hostName} role=${if lib.hasPrefix "cp-" name then "control-plane" else "worker"} stateVersion=${cfg.config.system.stateVersion} EOF ''; in { nixosConfigurations = lib.genAttrs nodeNames mkNodeByName; checks.${system} = lib.genAttrs nodeNames mkEvalCheck; }; }