{ hscloud, pkgs, ... }: with builtins; let machines = (import ./defs-machines.nix); configurations = builtins.listToAttrs (map (machine: { name = machine.fqdn; value = pkgs.nixos ({ config, pkgs, ... }: { networking.hostName = machine.name; imports = [ ./modules/base.nix ./modules/kubernetes.nix ]; }); }) machines); scriptForMachine = machine: let configuration = configurations."${machine.fqdn}"; in '' set -e remote=root@${machine.fqdn} echo "Configuration for ${machine.fqdn} is ${configuration.toplevel}" nix copy --no-check-sigs -s --to ssh://$remote ${configuration.toplevel} echo "/etc/systemd/system diff:" ssh $remote diff -ur /var/run/current-system/etc/systemd/system ${configuration.toplevel}/etc/systemd/system || true echo "" echo "" ssh $remote ${configuration.toplevel}/bin/switch-to-configuration dry-activate read -p "Do you want to switch to this configuration? " -n 1 -r echo if [[ $REPLY =~ ^[Yy]$ ]]; then ssh $remote ${configuration.toplevel}/bin/switch-to-configuration switch fi ''; provisioners = (map (machine: pkgs.writeScriptBin "provision-${machine.name}" (scriptForMachine machine) ) machines); provision = pkgs.writeScriptBin "provision" ( '' echo "Available provisioniers:" '' + (concatStringsSep "\n" (map (machine: "echo ' provision-${machine.name}'") machines))); in pkgs.symlinkJoin { name = "provision"; paths = [ provision ] ++ provisioners; }