| # Top-level wrapper script for calling per-machine provisioners. |
| # |
| # Given ops.machines."edge01.waw.bgp.wtf".config.passthru.hscloud.provision, |
| # this script allows to run it by doing: |
| # $ $(nix-build -A ops.provision) edge01.waw.bgp.wtf |
| # Or, to first list all available machines by doing: |
| # $ $(nix-build -A ops.provision) |
| # |
| # The main logic of the provisioner script is in machines.nix. |
| |
| { hscloud, pkgs, lib, ... }: |
| |
| with lib; with builtins; |
| |
| let |
| |
| # All machines from ops.machines, keyed by FQDN. |
| machines = filterAttrs (n: _: n != "__readTree") hscloud.ops.machines; |
| # Machines' provisioner scripts, keyed by machine FQDN. |
| machineProvisioners = mapAttrs (_: v: v.config.passthru.hscloud.provision) machines; |
| # List of machine FQDNs. |
| machineNames = attrNames machines; |
| |
| # User-friendly list of machines by FQDN. |
| machineList = concatStringsSep "\n" |
| (map |
| (name: " - ${name}") |
| machineNames); |
| |
| # Derivation containing bin/provision-FQDN symlinks to machines' provisioners. |
| forest = pkgs.linkFarm "provision-forest" |
| (mapAttrsToList |
| (fqdn: p: { name = "bin/provision-${fqdn}"; path = p; }) |
| machineProvisioners); |
| in |
| |
| pkgs.writeScript "provision" '' |
| #!/bin/sh |
| name="$1" |
| |
| usage() { |
| echo >&2 "Usage: $0 machine|machine.hswaw.net" |
| echo >&2 "Available machines:" |
| echo >&2 "${machineList}" |
| } |
| |
| if [ -z "$name" ]; then |
| usage |
| exit 1 |
| fi |
| |
| provisioner="${forest}/bin/provision-$name" |
| if [ ! -e "$provisioner" ]; then |
| name="$name.hswaw.net" |
| provisioner="${forest}/bin/provision-$name" |
| fi |
| if [ ! -e "$provisioner" ]; then |
| usage |
| exit 1 |
| fi |
| # :^) |
| echo -ne "\e[34mh \e[31ms \e[33mc l \e[34mo \e[32mu \e[31md \e[0m" |
| echo "" |
| echo "Starting provisioner for $name..." |
| echo "" |
| echo "Too slow to evaluate? Equivalent faster command line that rebuilds just one node:" |
| echo " \$(nix-build -A 'ops.machines.\"$name\".config.passthru.hscloud.provision')" |
| echo "" |
| echo "Or, if you want to deploy the same configuration on different machines, just run" |
| echo "this script again without re-evaluating nix:" |
| echo " $0 $name" |
| echo "" |
| exec "$provisioner" |
| '' |