How to make one flake.nix for multiple hosts

Hi!

How can I use the same flake.nix file for hosts with different hostnames?

This is my flake config:

    {
      nixosConfigurations.host-1 = nixpkgs.lib.nixosSystem {
        specialArgs = args;
        modules = [
          nix-flatpak.nixosModules.nix-flatpak
          home-manager.nixosModules.home-manager
          {
            home-manager = {
              useGlobalPkgs = true;
              useUserPackages = true;
              extraSpecialArgs = args;
              sharedModules = [ plasma-manager.homeManagerModules.plasma-manager ];
              users = {
                jeansib = import ./home-manager/jeansib/home.nix;
              };
            };
          }
          nix-index-db.nixosModules.nix-index
          ./configuration.nix
        ];
      };
  }

And I was thinking about doing something like this:

    {
      nixosConfigurations = [ "host-1" "host-2" "host-3" ] = nixpkgs.lib.nixosSystem {
        specialArgs = args;
        modules = [
          nix-flatpak.nixosModules.nix-flatpak
          home-manager.nixosModules.home-manager
          {
            home-manager = {
              useGlobalPkgs = true;
              useUserPackages = true;
              extraSpecialArgs = args;
              sharedModules = [ plasma-manager.homeManagerModules.plasma-manager ];
              users = {
                jeansib = import ./home-manager/jeansib/home.nix;
              };
            };
          }
          nix-index-db.nixosModules.nix-index
          ./configuration.nix
        ];
      };
  }

Is this possible?

You could try to define your config in the let part and then just use it as sort of a variable in the in part. Like following:

{
  description = "NixOS config for multiple hosts";

  inputs = {
    nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
    nix-flatpak.url = "github:gmodena/nix-flatpak/";
    home-manager.url = "github:nix-community/home-manager";
    nix-index-db.url = "github:nix-community/nix-index-database";
    plasma-manager.url = "github:nix-community/plasma-manager";
  };

  outputs = { self, nixpkgs, nix-flatpak, home-manager, nix-index-db, plasma-manager, ... }:
    let
      system = "x86_64-linux";
      lib = nixpkgs.lib;
      mkHostConfig = hostname: lib.nixosSystem {
        inherit system;
        specialArgs = { inherit inputs; };
        modules = [
          nix-flatpak.nixosModules.nix-flatpak
          home-manager.nixosModules.home-manager
          {
            home-manager = {
              useGlobalPkgs = true;
              useUserPackages = true;
              extraSpecialArgs = { inherit inputs; };
              sharedModules = [ plasma-manager.homeManagerModules.plasma-manager ];
              users = {
                jeansib = import ./home-manager/jeansib/home.nix;
              };
            };
          }
          nix-index-db.nixosModules.nix-index
          ./configuration.nix
          { networking.hostName = hostname; }
        ];
      };
    in
    {
      nixosConfigurations = {
        host-1 = mkHostConfig "host-1";
        host-2 = mkHostConfig "host-2";
        host-3 = mkHostConfig "host-3";
      };
    };
}

1 Like

Thanks! That worked.

1 Like