summaryrefslogtreecommitdiffstats
path: root/nixos/modules
diff options
context:
space:
mode:
authorRyan Mulligan <ryan@ryantm.com>2022-03-15 16:06:56 -0700
committerGitHub <noreply@github.com>2022-03-15 16:06:56 -0700
commit0ab73f9a3fe0d8a305db88650baef4a6bb792f29 (patch)
tree80b17b7be127a8e5eaaf85d1fdc8dfe9b9cad329 /nixos/modules
parentcec02f35167a49490f3ee8e32673f22f87a8132a (diff)
parent70c1e849c0b5741e07e7d8d0d418764e2fdb4e24 (diff)
Merge pull request #162535 from astro/pacemaker
pacemaker: init
Diffstat (limited to 'nixos/modules')
-rw-r--r--nixos/modules/module-list.nix2
-rw-r--r--nixos/modules/services/cluster/corosync/default.nix112
-rw-r--r--nixos/modules/services/cluster/pacemaker/default.nix52
3 files changed, 166 insertions, 0 deletions
diff --git a/nixos/modules/module-list.nix b/nixos/modules/module-list.nix
index 13703968167c..68f9c6c1227e 100644
--- a/nixos/modules/module-list.nix
+++ b/nixos/modules/module-list.nix
@@ -302,6 +302,7 @@
./services/backup/znapzend.nix
./services/blockchain/ethereum/geth.nix
./services/backup/zrepl.nix
+ ./services/cluster/corosync/default.nix
./services/cluster/hadoop/default.nix
./services/cluster/k3s/default.nix
./services/cluster/kubernetes/addons/dns.nix
@@ -314,6 +315,7 @@
./services/cluster/kubernetes/pki.nix
./services/cluster/kubernetes/proxy.nix
./services/cluster/kubernetes/scheduler.nix
+ ./services/cluster/pacemaker/default.nix
./services/cluster/spark/default.nix
./services/computing/boinc/client.nix
./services/computing/foldingathome/client.nix
diff --git a/nixos/modules/services/cluster/corosync/default.nix b/nixos/modules/services/cluster/corosync/default.nix
new file mode 100644
index 000000000000..b4144917feea
--- /dev/null
+++ b/nixos/modules/services/cluster/corosync/default.nix
@@ -0,0 +1,112 @@
+{ config, lib, pkgs, ... }:
+
+with lib;
+let
+ cfg = config.services.corosync;
+in
+{
+ # interface
+ options.services.corosync = {
+ enable = mkEnableOption "corosync";
+
+ package = mkOption {
+ type = types.package;
+ default = pkgs.corosync;
+ defaultText = literalExpression "pkgs.corosync";
+ description = "Package that should be used for corosync.";
+ };
+
+ clusterName = mkOption {
+ type = types.str;
+ default = "nixcluster";
+ description = "Name of the corosync cluster.";
+ };
+
+ extraOptions = mkOption {
+ type = with types; listOf str;
+ default = [];
+ description = "Additional options with which to start corosync.";
+ };
+
+ nodelist = mkOption {
+ description = "Corosync nodelist: all cluster members.";
+ default = [];
+ type = with types; listOf (submodule {
+ options = {
+ nodeid = mkOption {
+ type = int;
+ description = "Node ID number";
+ };
+ name = mkOption {
+ type = str;
+ description = "Node name";
+ };
+ ring_addrs = mkOption {
+ type = listOf str;
+ description = "List of addresses, one for each ring.";
+ };
+ };
+ });
+ };
+ };
+
+ # implementation
+ config = mkIf cfg.enable {
+ environment.systemPackages = [ cfg.package ];
+
+ environment.etc."corosync/corosync.conf".text = ''
+ totem {
+ version: 2
+ secauth: on
+ cluster_name: ${cfg.clusterName}
+ transport: knet
+ }
+
+ nodelist {
+ ${concatMapStrings ({ nodeid, name, ring_addrs }: ''
+ node {
+ nodeid: ${toString nodeid}
+ name: ${name}
+ ${concatStrings (imap0 (i: addr: ''
+ ring${toString i}_addr: ${addr}
+ '') ring_addrs)}
+ }
+ '') cfg.nodelist}
+ }
+
+ quorum {
+ # only corosync_votequorum is supported
+ provider: corosync_votequorum
+ wait_for_all: 0
+ ${optionalString (builtins.length cfg.nodelist < 3) ''
+ two_node: 1
+ ''}
+ }
+
+ logging {
+ to_syslog: yes
+ }
+ '';
+
+ environment.etc."corosync/uidgid.d/root".text = ''
+ # allow pacemaker connection by root
+ uidgid {
+ uid: 0
+ gid: 0
+ }
+ '';
+
+ systemd.packages = [ cfg.package ];
+ systemd.services.corosync = {
+ wantedBy = [ "multi-user.target" ];
+ serviceConfig = {
+ StateDirectory = "corosync";
+ StateDirectoryMode = "0700";
+ };
+ };
+
+ environment.etc."sysconfig/corosync".text = lib.optionalString (cfg.extraOptions != []) ''
+ COROSYNC_OPTIONS="${lib.escapeShellArgs cfg.extraOptions}"
+ '';
+ };
+}
diff --git a/nixos/modules/services/cluster/pacemaker/default.nix b/nixos/modules/services/cluster/pacemaker/default.nix
new file mode 100644
index 000000000000..7eeadffcc586
--- /dev/null
+++ b/nixos/modules/services/cluster/pacemaker/default.nix
@@ -0,0 +1,52 @@
+{ config, lib, pkgs, ... }:
+
+with lib;
+let
+ cfg = config.services.pacemaker;
+in
+{
+ # interface
+ options.services.pacemaker = {
+ enable = mkEnableOption "pacemaker";
+
+ package = mkOption {
+ type = types.package;
+ default = pkgs.pacemaker;
+ defaultText = literalExpression "pkgs.pacemaker";
+ description = "Package that should be used for pacemaker.";
+ };
+ };
+
+ # implementation
+ config = mkIf cfg.enable {
+ assertions = [ {
+ assertion = config.services.corosync.enable;
+ message = ''
+ Enabling services.pacemaker requires a services.corosync configuration.
+ '';
+ } ];
+
+ environment.systemPackages = [ cfg.package ];
+
+ # required by pacemaker
+ users.users.hacluster = {
+ isSystemUser = true;
+ group = "pacemaker";
+ home = "/var/lib/pacemaker";
+ };
+ users.groups.pacemaker = {};
+
+ systemd.tmpfiles.rules = [
+ "d /var/log/pacemaker 0700 hacluster pacemaker -"
+ ];
+
+ systemd.packages = [ cfg.package ];
+ systemd.services.pacemaker = {
+ wantedBy = [ "multi-user.target" ];
+ serviceConfig = {
+ StateDirectory = "pacemaker";
+ StateDirectoryMode = "0700";
+ };
+ };
+ };
+}