# Top-level file aggregating all machines managed from hscloud. # # This allows to have a common attrset of machines that can be deployed # in the same way. # # For information about building/deploying machines see //ops/README.md. { hscloud, pkgs, ... }: let # nixpkgs for cluster machines (.hswaw.net). Currently pinned to an old # nixpkgs because NixOS modules for kubernetes changed enough that it's not # super easy to use them as is. # # TODO(q3k): fix this: use an old nixpkgs for Kube modules while using # hscloud nixpkgs for everything else. nixpkgsCluster = import (pkgs.fetchFromGitHub { owner = "nixos"; repo = "nixpkgs-channels"; rev = "44ad80ab1036c5cc83ada4bfa451dac9939f2a10"; sha256 = "1b61nzvy0d46cspy07szkc0rggacxiqg9v1py27pkqpj7rvawfsk"; }) { overlays = [ (self: super: rec { # Use a newer version of Ceph (16, Pacific, EOL 2023-06-01) than in # this nixpkgs (15, Octopus, EOL 2022-06-01). # # This is to: # 1. Fix a bug in which ceph-volume lvm create fails due to a rocksdb # mismatch (https://tracker.ceph.com/issues/49815) # 2. At the time of deployment not start out with an ancient version # of Ceph. # # Once we unpin nixpkgsCluster past a version that contains this Ceph, # this can be unoverlayed. inherit (super.callPackages ./ceph { boost = super.boost17x.override { enablePython = true; python = super.python3; }; lua = super.lua5_4; }) ceph ceph-client; ceph-lib = ceph.lib; }) ]; }; # edge01 still lives on an old nixpkgs checkout. # # TODO(b/3): unpin and deploy. nixpkgsBgpwtf = import (pkgs.fetchFromGitHub { owner = "nixos"; repo = "nixpkgs-channels"; rev = "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38"; sha256 = "1ak7jqx94fjhc68xh1lh35kh3w3ndbadprrb762qgvcfb8351x8v"; }) {}; # Stopgap measure to import //cluster/nix machine definitions into new # //ops/ infrastructure. # # TODO(q3k): inject defs-cluster-k0.nix / defs-machines.nix content via # nixos options instead of having module definitions loading it themselves, # deduplicate list of machines below with defs-machines.nix somehow. clusterMachineConfig = name: [({ config, pkgs, ...}: { # The hostname is used by //cluster/nix machinery to load the appropriate # config from defs-machines into defs-cluster-k0. networking.hostName = name; imports = [ ../cluster/nix/modules/base.nix ../cluster/nix/modules/kubernetes.nix ../cluster/nix/modules/ceph.nix ]; })]; # mkMachine builds NixOS modules into a NixOS derivation, and injects # passthru.hscloud.provision which deploys that configuration over SSH to a # production machine. mkMachine = pkgs: paths: pkgs.nixos ({ config, pkgs, ... }: { imports = paths; config = let name = config.networking.hostName; domain = if (config.networking ? domain) && config.networking.domain != null then config.networking.domain else "hswaw.net"; fqdn = name + "." + domain; toplevel = config.system.build.toplevel; runProvision = '' #!/bin/sh set -eu remote=root@${fqdn} echo "Configuration for ${fqdn} is ${toplevel}" nix copy -s --to ssh://$remote ${toplevel} running="$(ssh $remote readlink -f /nix/var/nix/profiles/system)" if [ "$running" == "${toplevel}" ]; then echo "${fqdn} already running ${toplevel}." else echo "/etc/systemd/system diff:" ssh $remote diff -ur /var/run/current-system/etc/systemd/system ${toplevel}/etc/systemd/system || true echo "" echo "" echo "dry-activate diff:" ssh $remote ${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 exit 1 fi echo -ne "\n\nswitch-to-configuration test...\n" ssh $remote ${toplevel}/bin/switch-to-configuration test fi echo -ne "\n\n" read -p "Do you want to set this configuration as boot? " -n 1 -r echo if ! [[ $REPLY =~ ^[Yy]$ ]]; then exit 1 fi echo -ne "\n\nsetting system profile...\n" ssh $remote nix-env -p /nix/var/nix/profiles/system --set ${toplevel} echo -ne "\n\nswitch-to-configuration boot...\n" ssh $remote ${toplevel}/bin/switch-to-configuration boot ''; in { passthru.hscloud.provision = pkgs.writeScript "provision-${fqdn}" runProvision; }; }); in { "bc01n01.hswaw.net" = mkMachine nixpkgsCluster (clusterMachineConfig "bc01n01"); "bc01n02.hswaw.net" = mkMachine nixpkgsCluster (clusterMachineConfig "bc01n02"); "dcr01s22.hswaw.net" = mkMachine nixpkgsCluster (clusterMachineConfig "dcr01s22"); "dcr01s24.hswaw.net" = mkMachine nixpkgsCluster (clusterMachineConfig "dcr01s24"); "edge01.waw.bgp.wtf" = mkMachine nixpkgsBgpwtf [ ../bgpwtf/machines/edge01.waw.bgp.wtf.nix ../bgpwtf/machines/edge01.waw.bgp.wtf-hardware.nix ]; }