Skip to content

Instantly share code, notes, and snippets.

@thoughtpolice
Created April 4, 2015 08:54
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save thoughtpolice/cafbb7503826e3c67896 to your computer and use it in GitHub Desktop.
Save thoughtpolice/cafbb7503826e3c67896 to your computer and use it in GitHub Desktop.
Bootstrap script for NixOS Rackspace
#!/usr/bin/env bash
unset CDPATH
DISK=/dev/xvdb
PARTITION=/dev/xvdb1
FSTYPE=ext4
LABEL=nixos
## -----------------------------------------------------------------------------
## -- NixOS configuration template
NIXCFG=$(cat <<EOF
{ config, pkgs, ... }:
{
imports = [ ./hardware-configuration.nix ];
boot.loader.grub.enable = true;
boot.loader.grub.version = 2;
boot.loader.grub.device = "$DISK";
time.timeZone = "America/Chicago";
networking.hostName = "nixos"; # Define your hostname.
networking.interfaces.eth0.ipAddress = "IPV4ADDR1";
networking.interfaces.eth0.prefixLength = 24;
networking.interfaces.eth1.ipAddress = "IPV4ADDR2";
networking.interfaces.eth1.prefixLength = 19;
networking.defaultGateway = "GATEWAY";
networking.nameservers = [ "NAMESERVER1" "NAMESERVER2" ];
i18n = {
consoleFont = "lat9w-16";
consoleKeyMap = "us";
defaultLocale = "en_US.UTF-8";
};
environment.systemPackages = with pkgs; [
wget
];
services.openssh.enable = true;
security.sudo.wheelNeedsPassword = false;
users.extraUsers.root.openssh.authorizedKeys.keys = [
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDKN53e1R17ha560eN3TJ/uV63vgppBVOGB2bZ5H7AnvVdrV6ZnrRU0LY9VBx0bF5q2+Hst8X9xOuTKLg38XFLkSWjI0Bxt4qYbwRr8RyafI8n0UUV/sLFPEkVw2Y2jUlMxGhPUtCXZbB8V2n8Zcn/QESnUKOzZHGh2VuQ1ydra58gCK6jDot51lNh4oT0WL3F+KY7cKGv5uyDLtaGxxiPYBRZvhBLjdPAYfkTa1NOAYoN3wPfFtH4xuCP2nTSbodAgQ/UsY/aNdNkK97//GZzT5h7cA4G+//b5tNaGCN0j7RJ6wSGFCut3QvKiYlsU0sAuwyYhizuo/+IoWV2LT2W6pHRe5Ivodyzm97bkWzI+UzGKLP5VKH55Pol4iIhnavhUP5j4IIr5Xplbvp+BdVVgfaSWpRH0t4ALyn1oDZZNUkzjwFbw/EPkdndJjChziEPO31koPBFcm/IB7DvXYjPrTY9S5nlF7QbA2A3118oem4V9A4FNi9gijFJspkHPFJ2CzFoYbCg9fCwPkeS/poS6ZgBL0p4sMoqxj+2OUdS6Vg8IO143YIUmA7FcFYafhhpTWSD44lja7a8RkDcukOA2YdcuMf5f10xbW3auZ3Gjatj1Jp0hTqIT78FaEBoZJnSmJSwi/hyMWV/vix+SCw3BPwjIJ/xQUccpNwh++E/Zdw== a@link"
];
}
EOF
)
## -----------------------------------------------------------------------------
## -- Basic functions
function good { echo "[+]" $1; }
function onoes { echo "[-]" $1; }
function info { echo "[!]" $1; }
## -----------------------------------------------------------------------------
## -- Setup steps
function setup_tools {
good "Installing needed packages and temporary users..."
(apt-get update && \
apt-get install bzip2 && \
addgroup nixbld && \
((echo; echo; echo; echo; echo; echo) | adduser --disabled-password nixbld0) && \
usermod -a -G nixbld nixbld0) >/dev/null 2>&1
}
function partition_disk { # (partition)
good "Formatting disk ($1)..."
(echo d; echo w;) | fdisk $1 >/dev/null 2>&1
(echo n; echo; echo; echo; echo; echo w) | fdisk $1 >/dev/null 2>&1
}
function format_disk { # (fstype, partition, label)
good "Formatting '$2' as $1 (name='$3')"
mkfs.$1 $2 -L $3 >/dev/null 2>&1
mount $2 /mnt >/dev/null 2>&1
mkdir /mnt/boot >/dev/null 2>&1
}
function install_nixpkgs {
good "Installing nixpkgs..."
curl -s -o install-nix.sh https://nixos.org/nix/install >/dev/null 2>&1
bash ./install-nix.sh >/dev/null 2>&1
rm -f ./install-nix.sh
}
function update_nixpkgs {
good "Updating channels..."
. /root/.nix-profile/etc/profile.d/nix.sh >/dev/null 2>&1
nix-channel --remove nixpkgs >/dev/null 2>&1
nix-channel --add http://nixos.org/channels/nixos-unstable nixos >/dev/null 2>&1
nix-channel --update >/dev/null 2>&1
}
function bootstrap_nixos_tools {
good "Installing NixOS utilities..."
cat <<EOF > configuration.nix
{ fileSystems."/" = {};
boot.loader.grub.enable = false;
}
EOF
export NIX_PATH=nixpkgs=/root/.nix-defexpr/channels/nixos:nixos=/root/.nix-defexpr/channels/nixos/nixos
export NIXOS_CONFIG=/root/configuration.nix
nix-env -i -A config.system.build.nixos-install \
-A config.system.build.nixos-option \
-A config.system.build.nixos-generate-config \
-f "<nixos>" >/dev/null 2>&1
}
function generate_nixos_conf {
good "Generating template installation..."
nixos-generate-config --root /mnt >/dev/null 2>&1
echo "$NIXCFG" > /mnt/etc/nixos/configuration.nix
# Now, substitute in values for the networking configuration.
GATEWAY=$(grep gateway /etc/network/interfaces | awk '{print $2}' | head -1)
NS1=$(grep nameserver /etc/resolv.conf | awk '{print $2}' | head -1)
NS2=$(grep nameserver /etc/resolv.conf | awk '{print $2}' | tail -1)
perl -pi -e "s/GATEWAY/$GATEWAY/" /mnt/etc/nixos/configuration.nix
perl -pi -e "s/NAMESERVER1/$NS1/" /mnt/etc/nixos/configuration.nix
perl -pi -e "s/NAMESERVER2/$NS2/" /mnt/etc/nixos/configuration.nix
# IPv4 public network interface:
PUBIPV4=$(grep address /etc/network/interfaces | awk '{print $2}' | head -1)
perl -pi -e "s/IPV4ADDR1/$PUBIPV4/" /mnt/etc/nixos/configuration.nix
# IPv4 private network interface:
PRIVIPV4=$(grep address /etc/network/interfaces | awk '{print $2}' | tail -1)
perl -pi -e "s/IPV4ADDR2/$PRIVIPV4/" /mnt/etc/nixos/configuration.nix
}
function install_nixos {
good "Installing NixOS..."
unset NIXOS_CONFIG
nixos-install >/dev/null 2>&1
# Now, substitute *back* the right name for post-reboot
perl -pi -e "s#$DISK#/dev/xvda#" /mnt/etc/nixos/configuration.nix
}
## -----------------------------------------------------------------------------
## -- Main program
cd /root
setup_tools
partition_disk $DISK
format_disk $FSTYPE $PARTITION $LABEL
install_nixpkgs
update_nixpkgs
bootstrap_nixos_tools
generate_nixos_conf
install_nixos
good "OK, all done. You can now reboot."
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment