Created
December 10, 2016 17:00
-
-
Save thearchitect/959f3c05c486bbb4e35244e800249ad1 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { config, lib, pkgs, ... }: | |
| let | |
| cfg = { | |
| hostName = "zion"; | |
| ceph = { | |
| enable = true; | |
| publicIP = "127.0.0.1"; | |
| privateIP = "127.0.0.1"; | |
| osds = [ | |
| { id = 1; monID = "a"; uuid = "342e8fed-d2b9-4c50-aef4-0cba692c1aeb"; dev = "sda"; } | |
| { id = 2; monID = "b"; uuid = "e8c0eeb1-4161-4bab-ad4c-ed82325982fe"; dev = "sdb"; } | |
| { id = 3; monID = "c"; uuid = "519995d7-9d38-4b65-ab8b-e7162b0c27bf"; dev = "sdc"; } | |
| { id = 4; monID = "d"; uuid = "2537b082-d36d-4e64-aaea-c40ee04bcebe"; dev = "sdd"; } | |
| ]; | |
| }; | |
| }; | |
| in | |
| { | |
| system.stateVersion = "16.09"; | |
| imports = | |
| [ | |
| <nixpkgs/nixos/modules/installer/scan/not-detected.nix> | |
| ]; | |
| boot.initrd.availableKernelModules = [ "xhci_pci" "ehci_pci" "ahci" "usb_storage" "usbhid" "sd_mod" "sr_mod" "sdhci_pci" ]; | |
| boot.kernelModules = [ | |
| "pcspkr" | |
| "usb_storage" | |
| "tun" | |
| "virtio" | |
| "kvm" "kvm-intel" | |
| "ceph" "rbd" | |
| "btrfs" | |
| "nvidia" "nvidia_uvm" "nvidia_drm" "nvidia_modeset" | |
| ]; | |
| boot.extraModulePackages = [ ]; | |
| fileSystems = { | |
| "/" = { | |
| device = "/dev/disk/by-uuid/1a381f95-4614-42c9-9b04-751af97aabf7"; | |
| # device = "/dev/disk/by-label/nixos-usb"; | |
| fsType = "btrfs"; | |
| options = [ "subvol=nixos" "ssd" "autodefrag" "noatime" "nospace_cache" "compress-force=zlib" ]; | |
| }; | |
| "/boot/efi" = { | |
| device = "/dev/disk/by-uuid/0FF6-D04F"; | |
| options = [ "noatime" ]; | |
| }; | |
| "/tmp" = { | |
| device = "tmpfs"; | |
| fsType = "tmpfs"; | |
| options = [ | |
| "noexec" | |
| "nodev" | |
| "nosuid" | |
| "size=8192m" | |
| "mode=1777" | |
| ]; | |
| }; | |
| }; | |
| swapDevices = []; | |
| nix.maxJobs = lib.mkDefault 1; | |
| boot.loader.grub.enable = true; | |
| boot.loader.grub.version = 2; | |
| boot.loader.grub.efiSupport = true; | |
| boot.loader.grub.efiInstallAsRemovable = true; | |
| boot.loader.efi.efiSysMountPoint = "/boot/efi"; | |
| boot.loader.grub.device = "nodev"; # or "nodev" for efi only | |
| boot.loader.timeout = 1; | |
| boot.kernelPackages = pkgs.linuxPackages_4_8; | |
| networking = { | |
| hostName = cfg.hostName; | |
| nameservers = [ "127.0.0.1" "8.8.8.8" ]; | |
| firewall = { | |
| enable = true; | |
| allowPing = true; | |
| trustedInterfaces = [ "wlan0_ap" "lan0" "lan1" ]; | |
| checkReversePath = false; | |
| allowedTCPPorts = [ | |
| 22 # ssh | |
| 80 # http | |
| 443 # https | |
| ]; | |
| allowedUDPPorts = [ ]; | |
| }; | |
| nat = { | |
| enable = true; | |
| internalIPs = [ "10.0.3.0/24" "10.0.4.0/24" "10.0.5.0/24" ]; | |
| externalInterface = "wan1_modem_yota"; | |
| }; | |
| interfaces = { | |
| wlan0_ap = { | |
| ipAddress = "10.0.3.1"; | |
| prefixLength = 24; | |
| ip4 = [ { address = "10.0.3.1"; prefixLength = 24; } ]; | |
| }; | |
| lan0 = { | |
| ipAddress = "10.0.4.1"; | |
| prefixLength = 24; | |
| ip4 = [ { address = "10.0.4.1"; prefixLength = 24; } ]; | |
| }; | |
| lan1 = { | |
| ipAddress = "10.0.5.1"; | |
| prefixLength = 24; | |
| ip4 = [ { address = "10.0.5.1"; prefixLength = 24; } ]; | |
| }; | |
| wan1_modem_yota = { | |
| useDHCP = true; | |
| }; | |
| }; | |
| networkmanager = { | |
| enable = false; | |
| }; | |
| }; | |
| time.timeZone = "Etc/GMT-4"; | |
| nixpkgs = { | |
| config = { | |
| allowUnfree = true; | |
| }; | |
| }; | |
| environment = { | |
| systemPackages = with pkgs; [ | |
| zile #emacs24-nox | |
| mc | |
| htop | |
| wget | |
| ceph | |
| kvm | |
| #qemu #spice-vdagent | |
| #win-qemu | |
| xen | |
| #networkmanager | |
| iproute | |
| iw wirelesstools rfkill | |
| nssmdns | |
| lsof | |
| hdparm | |
| btrfs-progs | |
| #dropbox-cli | |
| (pkgs.substituteAll { | |
| name = "nix+force-cleanup"; | |
| dir = "bin"; | |
| isExecutable = true; | |
| src = pkgs.writeScript "nix+force-cleanup" ''#! ${pkgs.stdenv.shell} -e | |
| ${pkgs.zsh}/bin/zsh << ZSHEOF | |
| if [[ $UID == 0 || $EUID == 0 ]]; then | |
| ${pkgs.nix}/bin/nix-env --delete-generations 2d | |
| ${pkgs.nix}/bin/nix-store --gc --print-dead | |
| ${pkgs.nix}/bin/nix-store --gc | |
| ${pkgs.nix}/bin/nix-collect-garbage -d | |
| ${pkgs.nix}/bin/nix-store --optimise | |
| else | |
| echo Please, run this as root | |
| fi | |
| ZSHEOF''; | |
| }) | |
| (pkgs.substituteAll { | |
| name = "force-ceph-mkfs"; | |
| dir = "bin"; | |
| isExecutable = true; | |
| src = pkgs.writeScript "force-ceph-mkfs" ''#! ${pkgs.stdenv.shell} | |
| dev=/dev/$1 | |
| mp=/tmp/$1 | |
| #${pkgs.coreutils}/bin/dd if=/dev/zero of=$dev bs=8M count=8 status=progress | |
| ${pkgs.btrfs-progs}/bin/mkfs.btrfs -f $dev | |
| ${pkgs.coreutils}/bin/mkdir $mp | |
| ${pkgs.utillinux}/bin/mount $dev $mp | |
| ${pkgs.btrfs-progs}/bin/btrfs subvolume create $mp/osd | |
| ${pkgs.btrfs-progs}/bin/btrfs subvolume create $mp/mon | |
| ${pkgs.btrfs-progs}/bin/btrfs subvolume create $mp/mds | |
| ${pkgs.utillinux}/bin/umount $mp | |
| ${pkgs.coreutils}/bin/rmdir $mp | |
| ''; | |
| }) | |
| ]; | |
| noXlibs = true; | |
| }; | |
| programs = { | |
| ssh = { | |
| startAgent = false; | |
| }; | |
| bash = { | |
| enableCompletion = true; | |
| }; | |
| }; | |
| services = { | |
| udev = { | |
| extraRules = '' | |
| SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="", ATTR{dev_id}=="0x0", ATTR{type}=="1", NAME="wlan0_ap" | |
| SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="", ATTR{dev_id}=="0x0", ATTR{type}=="1", NAME="wlan1_ap" | |
| SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="", ATTR{dev_id}=="0x0", ATTR{type}=="1", NAME="wan1_modem_yota" | |
| SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="", ATTR{dev_id}=="0x0", ATTR{type}=="1", NAME="wan0" | |
| SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="", ATTR{dev_id}=="0x0", ATTR{type}=="1", NAME="lan0" | |
| SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="", ATTR{dev_id}=="0x0", ATTR{type}=="1", NAME="lan1" | |
| ''; | |
| }; | |
| xserver.enable = false; | |
| dbus = { | |
| #packages = with pkgs; [ avahi ]; | |
| }; | |
| openssh = { | |
| enable = true; | |
| permitRootLogin = "without-password"; | |
| passwordAuthentication = false; | |
| gatewayPorts = "yes"; | |
| extraConfig = '' | |
| PasswordAuthentication=no | |
| KbdInteractiveAuthentication=no | |
| ChallengeResponseAuthentication=no | |
| PermitTunnel yes | |
| ''; | |
| }; | |
| avahi = { | |
| enable = true; | |
| nssmdns = true; | |
| hostName = "${config.networking.hostName}"; | |
| wideArea = true; | |
| ipv4 = true; | |
| ipv6 = true; | |
| publish = { | |
| enable = true; | |
| domain = true; | |
| addresses = true; | |
| hinfo = true; | |
| userServices = true; | |
| workstation = true; | |
| }; | |
| # todo: | |
| #[server] | |
| #allow-point-to-point=yes | |
| #deny-interfaces=eth1 | |
| #[reflector] | |
| #enable-reflector=yes | |
| }; | |
| dnsmasq = { | |
| enable = true; | |
| servers = [ "8.8.8.8" "8.8.4.4" ]; | |
| extraConfig = '' | |
| listen-address=127.0.0.1,10.0.3.1,10.0.4.1,10.0.5.1 | |
| domain=lan | |
| interface=wlan0_ap | |
| interface=lan0 | |
| interface=lan1 | |
| bind-interfaces | |
| dhcp-range=10.0.3.16,10.0.3.254,24h | |
| dhcp-range=10.0.4.16,10.0.4.254,24h | |
| dhcp-range=10.0.5.16,10.0.5.254,24h | |
| ''; | |
| }; | |
| hostapd = { | |
| enable = true; | |
| interface = "wlan0_ap"; | |
| ssid = ""; | |
| wpa = true; | |
| wpaPassphrase = ""; | |
| #channel = 11; | |
| hwMode = "g"; | |
| extraConfig = '' | |
| wpa=2 | |
| wpa_key_mgmt=WPA-PSK | |
| wpa_pairwise=TKIP | |
| rsn_pairwise=CCMP | |
| auth_algs=3 | |
| macaddr_acl=0 | |
| ieee80211n=1 | |
| #ieee80211ac=1 | |
| wmm_enabled=1 | |
| ''; | |
| }; | |
| ntp = { | |
| enable = true; | |
| servers = [ | |
| "0.pool.ntp.org" | |
| "1.pool.ntp.org" | |
| "2.pool.ntp.org" | |
| "3.pool.ntp.org" | |
| ]; | |
| }; | |
| gpm = { | |
| enable = false; | |
| protocol = "ps/2"; | |
| }; | |
| atd = { | |
| enable = true; | |
| allowEveryone = true; | |
| }; | |
| udisks2 = { | |
| enable = true; | |
| }; | |
| }; | |
| virtualisation = { | |
| libvirtd = { | |
| enable = false; | |
| }; | |
| }; | |
| environment.etc."ceph/ceph.conf" = { | |
| mode = "0644"; | |
| text = lib.concatStringsSep "\n" (['' | |
| [global] | |
| fsid = | |
| public network = ${cfg.ceph.publicIP}/24 | |
| cluster network = ${cfg.ceph.privateIP}/24 | |
| auth cluster required = none | |
| auth service required = none | |
| auth client required = none | |
| log to syslog = false | |
| [mon] | |
| debug mon = 9 | |
| mon osd full ratio = .70 | |
| mon osd nearfull ratio = .60 | |
| mon osd down out interval = 0 | |
| mon osd report timeout = 300 | |
| [osd] | |
| filestore btrfs snap = true | |
| filestore max sync interval = 5 | |
| #osd crush update on start = true | |
| #[mds] | |
| ''] | |
| ++ (map (osd: '' | |
| [mon.${osd.monID}] | |
| host = ${cfg.hostName} | |
| mon addr = ${cfg.ceph.publicIP}:${toString (6789 + osd.id)} | |
| mon data = /ceph/${osd.dev}/mon | |
| [osd.${toString osd.id}] | |
| host = ${cfg.hostName} | |
| osd data = /ceph/${osd.dev}/osd/data | |
| osd journal = /ceph/${osd.dev}/osd/journal | |
| [mds.${toString osd.id}] | |
| host = ${cfg.hostName} | |
| mds data = /ceph/${osd.dev}/mds | |
| '') (cfg.ceph.osds)) | |
| ); | |
| }; | |
| systemd.services = { | |
| # builtins.listToAttrs (lib.flip map cfg.osds (osd: lib.nameValuePair "ceph-osd-${toString osd.id}" { | |
| } // (builtins.listToAttrs (builtins.concatLists (lib.flip map cfg.ceph.osds (osd: [ | |
| { | |
| name = "ceph-mon-${toString osd.monID}"; | |
| value = { | |
| ################################################################ | |
| #### | |
| #### Ceph MON | |
| #### | |
| enable = cfg.ceph.enable; | |
| wantedBy = [ "multi-user.target" ]; | |
| after = [ "network.target" ]; | |
| requires = [ ]; | |
| restartTriggers = [ config.environment.etc."ceph/ceph.conf".source ]; | |
| path = with pkgs; [ ceph zsh lsb-release getopt ]; | |
| script = ''${pkgs.ceph}/bin/ceph-mon -i ${osd.monID} -c /etc/ceph/ceph.conf --public-addr ${cfg.ceph.publicIP}:${toString (6789 + osd.id)} -f -d''; | |
| serviceConfig = { | |
| Type = "simple"; | |
| PermissionsStartOnly = true; | |
| Restart = "always"; | |
| RestartSec = 1; | |
| StartLimitInterval = 0; | |
| }; | |
| preStart = '' | |
| ${pkgs.hdparm}/bin/hdparm -W 0 /dev/${osd.dev} | |
| ${pkgs.utillinux}/bin/umount /ceph/${osd.dev}/mon || true | |
| ${pkgs.coreutils}/bin/rmdir /ceph/${osd.dev}/mon || true | |
| ${pkgs.coreutils}/bin/mkdir -p /ceph/${osd.dev}/mon | |
| ${pkgs.utillinux}/bin/mount -t btrfs -o rw,sync,noatime,autodefrag,nospace_cache,compress-force=zlib,subvol=mon /dev/${osd.dev} /ceph/${osd.dev}/mon | |
| ${pkgs.ceph}/bin/ceph-mon --mkfs -i ${osd.monID} -c /etc/ceph/ceph.conf -f -d | |
| ''; | |
| postStop = '' | |
| ${pkgs.utillinux}/bin/umount /ceph/${osd.dev}/mon | |
| ${pkgs.coreutils}/bin/rmdir /ceph/${osd.dev}/mon | |
| ${pkgs.coreutils}/bin/rmdir /ceph/${osd.dev} | true | |
| ''; | |
| #### | |
| #### EOF Ceph MON | |
| #### | |
| ################################################################ | |
| }; | |
| } | |
| { | |
| name = "ceph-osd-${toString osd.id}"; | |
| value = { | |
| ################################################################ | |
| #### | |
| #### Ceph OSD | |
| #### | |
| enable = cfg.ceph.enable; | |
| wantedBy = [ "multi-user.target" ]; | |
| after = [ "ceph-mon-${toString osd.monID}.service" ]; | |
| requires = [ "ceph-mon-${toString osd.monID}.service" ]; | |
| restartTriggers = [ config.environment.etc."ceph/ceph.conf".source ]; | |
| path = with pkgs; [ ceph utillinux hdparm ceph zsh lsb-release getopt coreutils btrfs-progs ]; | |
| script = ''${pkgs.ceph}/bin/ceph-osd -i ${toString osd.id} -c /etc/ceph/ceph.conf -f -d''; | |
| serviceConfig = { | |
| Type = "simple"; | |
| PermissionsStartOnly = true; | |
| Restart = "always"; | |
| RestartSec = 1; | |
| StartLimitInterval = 0; | |
| }; | |
| preStart = ''${pkgs.zsh}/bin/zsh << EOF | |
| ${pkgs.hdparm}/bin/hdparm -W 0 /dev/${osd.dev} | |
| ${pkgs.utillinux}/bin/umount /ceph/${osd.dev}/osd || true | |
| ${pkgs.coreutils}/bin/rmdir /ceph/${osd.dev}/osd || true | |
| ${pkgs.coreutils}/bin/mkdir -p /ceph/${osd.dev}/osd | |
| ${pkgs.utillinux}/bin/mount -t btrfs -o rw,sync,noatime,autodefrag,nospace_cache,compress-force=zlib,subvol=osd /dev/${osd.dev} /ceph/${osd.dev}/osd | |
| ${pkgs.coreutils}/bin/mkdir -p /ceph/${osd.dev}/osd/data | |
| ${pkgs.ceph}/bin/ceph osd create ${osd.uuid} ${toString osd.id} | true | |
| ${pkgs.ceph}/bin/ceph-osd --mkfs -i ${toString osd.id} --osd-uuid ${osd.uuid} -c /etc/ceph/ceph.conf -f -d | true | |
| EOF''; | |
| postStop = '' | |
| ${pkgs.utillinux}/bin/umount /ceph/${osd.dev}/osd | |
| ${pkgs.coreutils}/bin/rmdir /ceph/${osd.dev}/osd | |
| ${pkgs.coreutils}/bin/rmdir /ceph/${osd.dev} | true | |
| ''; | |
| #### | |
| #### EOF Ceph OSD | |
| #### | |
| ################################################################ | |
| }; | |
| } | |
| { | |
| name = "ceph-mds-${toString osd.id}"; | |
| value = { | |
| ################################################################ | |
| #### | |
| #### Ceph MDS | |
| #### | |
| enable = cfg.ceph.enable; | |
| wantedBy = [ "multi-user.target" ]; | |
| after = [ "ceph-mon-${toString osd.monID}.service" ]; | |
| requires = [ "ceph-mon-${toString osd.monID}.service" ]; | |
| restartTriggers = [ config.environment.etc."ceph/ceph.conf".source ]; | |
| path = with pkgs; [ ceph zsh lsb-release getopt ]; | |
| script = ''${pkgs.ceph}/bin/ceph-mds -i ${toString osd.id} -c /etc/ceph/ceph.conf -f -d''; | |
| serviceConfig = { | |
| Type = "simple"; | |
| PermissionsStartOnly = true; | |
| Restart = "always"; | |
| RestartSec = 1; | |
| StartLimitInterval = 0; | |
| }; | |
| preStart = '' | |
| ${pkgs.hdparm}/bin/hdparm -W 0 /dev/${osd.dev} | |
| ${pkgs.utillinux}/bin/umount /ceph/${osd.dev}/mds || true | |
| ${pkgs.coreutils}/bin/rmdir /ceph/${osd.dev}/mds || true | |
| ${pkgs.coreutils}/bin/mkdir -p /ceph/${osd.dev}/mds | |
| ${pkgs.utillinux}/bin/mount -t btrfs -o rw,sync,noatime,autodefrag,nospace_cache,compress-force=zlib,subvol=mds /dev/${osd.dev} /ceph/${osd.dev}/mds | |
| ''; | |
| postStop = '' | |
| ${pkgs.utillinux}/bin/umount /ceph/${osd.dev}/mds | |
| ${pkgs.coreutils}/bin/rmdir /ceph/${osd.dev}/mds | |
| ${pkgs.coreutils}/bin/rmdir /ceph/${osd.dev} | true | |
| ''; | |
| #### | |
| #### EOF Ceph MDS | |
| #### | |
| ################################################################ | |
| }; | |
| } | |
| ])))); | |
| security = { | |
| sudo = { | |
| enable = true; | |
| wheelNeedsPassword = false; | |
| }; | |
| }; | |
| users = { | |
| mutableUsers = false; | |
| users = { | |
| keeper = { | |
| isNormalUser = true; | |
| extraGroups = [ "wheel" ]; | |
| }; | |
| root.openssh.authorizedKeys.keys = [ | |
| ]; | |
| }; | |
| }; | |
| } |
bjornfor
commented
Dec 12, 2016
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment