| { 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; |
| } |