{ description = "Deployment for skynet"; inputs = { # gonna start off with a fairly modern base nixpkgs.url = "nixpkgs/nixos-22.11"; # utility stuff flake-utils.url = "github:numtide/flake-utils"; agenix.url = "github:ryantm/agenix"; deploy-rs.url = "github:serokell/deploy-rs"; }; outputs = { self, nixpkgs, deploy-rs, ... }: let # can centralise the config for each machiene here machine_config = [ # each system one line { # each machiene must have a name name = "test01"; # core info about it system = "x86_64-linux"; modules = [ ./machines/base.nix ]; # for the deployment hostname = "test01.home.brendan.ie"; sshUser = "root"; } ]; # the best part, nix is functional, so lets have some functions # map applies this function to every item in an array create_nixosConfigurations = map ( # converts it into {name_of_machiene = {system = '..'; modules = '..'}} config: { # need to extract teh name of the machiene ${config.name} = ( # nixpkgs.lib.nixosSystem is a fucntion that is used to turn a attribute set into the config for a machiene nixpkgs.lib.nixosSystem { system = config.system; modules = config.modules; } ); } ); # this takes the config attributes and turns it into something useful for the nodes create_nodes = map ( # this is fairly simple, just plug in teh values config: { ${config.name} = { hostname = config.hostname; profiles.system = { path = deploy-rs.lib."${config.system}".activate.nixos self.nixosConfigurations."${config.name}"; sshUser = config.sshUser; }; }; } ); # this merges together an array of atributes into just one set merge = nixpkgs.lib.lists.foldl (a: b: a // b) {}; in { # values created using the data and functions above nixosConfigurations = merge (create_nixosConfigurations machine_config); deploy.nodes = merge (create_nodes machine_config); # This is highly advised, and will prevent many possible mistakes checks = builtins.mapAttrs (system: deployLib: deployLib.deployChecks self.deploy) deploy-rs.lib; }; }