No description
Find a file
2020-12-15 21:56:51 -08:00
nix Also add Nix environment 2020-12-15 20:58:39 -08:00
src Initial commit 2020-12-15 20:23:02 -08:00
.gitattributes .gitattributes: Mark Niv and crate2nix files as generated 2020-12-15 21:07:27 -08:00
.gitignore Initial commit 2020-12-15 20:23:02 -08:00
Cargo.lock Initial commit 2020-12-15 20:23:02 -08:00
Cargo.nix Also add Nix environment 2020-12-15 20:58:39 -08:00
Cargo.toml Initial commit 2020-12-15 20:23:02 -08:00
default.nix Also add Nix environment 2020-12-15 20:58:39 -08:00
LICENSE Initial commit 2020-12-15 20:23:02 -08:00
pkgs.nix Also add Nix environment 2020-12-15 20:58:39 -08:00
README.md More docs 2020-12-15 21:56:51 -08:00
shell.nix Also add Nix environment 2020-12-15 20:58:39 -08:00
test-shell.nix Also add Nix environment 2020-12-15 20:58:39 -08:00

Colmena

Colmena is a simple, stateless NixOS deployment tool modeled after NixOps and Morph, written in Rust. It's a thin wrapper over Nix commands like nix-instantiate and nix-copy-closure, and supports parallel deployment.

Colmena is still an early prototype.

Tutorial

Enter a nix-shell with colmena with:

nix-shell test-shell.nix

Colmena should work with your existing NixOps and Morph configurations with minimal modification. Here is a sample hive.nix with two nodes, with some common configurations applied to both nodes:

{
  network = {
    # Override to pin the Nixpkgs version (recommended). This option
    # accepts one of the following:
    # - A path to a Nixpkgs checkout
    # - The Nixpkgs lambda (e.g., import <nixpkgs>)
    # - An initialized Nixpkgs attribute set
    nixpkgs = <nixpkgs>;
  };

  defaults = { pkgs, ... }: {
    # This module will be imported by all hosts
    environment.systemPackages = with pkgs; [
      vim wget curl
    ];
  };

  host-a = { name, nodes, ... }: {
    # The name and nodes parameters are supported in Colmena,
    # allowing you to reference configurations in other nodes.
    networking.hostName = name;
    time.timeZone = nodes.host-b.config.time.timeZone;

    boot.loader.grub.device = "/dev/sda";
    fileSystems."/" = {
      device = "/dev/sda1";
      fsType = "ext4";
    };
  };

  host-b = {
    # Like NixOps and Morph, Colmena will attempt to connect to
    # the remote host using the attribute name by default. You
    # can override it like:
    deployment.targetHost = "host-b.mydomain.tld";

    time.timeZone = "America/Los_Angeles";

    boot.loader.grub.device = "/dev/sda";
    fileSystems."/" = {
      device = "/dev/sda1";
      fsType = "ext4";
    };
  };
}

The full set of options can be found at src/eval.nix. Run colmena build in the same directory to build the configuration, or do colmena apply to deploy it to all nodes.

Current limitations

  • It's required to use SSH keys to log into the remote hosts, and interactive authentication will not work.
  • There is no option to override SSH or nix-copy-closure options.
  • Node tagging is not yet implemented.
  • Error reporting is lacking.

Licensing

Colmena is available under the MIT License.