close

infrastructure as nix code

terranix is a Nix-based infrastructure-as-code tool that combines the providers of Terraform (or OpenTofu) and the lazy, functional configuration of NixOS. terranix works as an alternative to HCL by generating Terraform JSON that can then be applied using the same providers.

terranix config.nix
let
  mkSite = { name, region }: {
    resource.digitalocean_droplet.${name} = {
      inherit name region;
      image = "ubuntu-22-04-x64";
      size  = "s-1vcpu-1gb";
    };
    resource.digitalocean_record.${name} = {
      domain = "example.com";
      type   = "A";
      inherit name;
      value  = "\${digitalocean_droplet.${name}.ipv4_address}";
    };
  };
in {
  imports = [
    (mkSite { name = "web-1"; region = "fra1"; })
    (mkSite { name = "web-2"; region = "nyc1"; })
    (mkSite { name = "web-3"; region = "sgp1"; })
  ];
}
HCL main.tf
locals {
  sites = {
    web-1 = "fra1"
    web-2 = "nyc1"
    web-3 = "sgp1"
  }
}

resource "digitalocean_droplet" "site" {
  for_each = local.sites
  name     = each.key
  region   = each.value
  image    = "ubuntu-22-04-x64"
  size     = "s-1vcpu-1gb"
}

resource "digitalocean_record" "site" {
  for_each = local.sites
  domain   = "example.com"
  type     = "A"
  name     = each.key
  value    = digitalocean_droplet.site[each.key].ipv4_address
}

Features

  • BERJAYA
    Full Nix language
    Use let-bindings, imports, conditionals, and module composition with the same language you already use for NixOS.
  • BERJAYA
    NixOS module system
    Type-checked configuration with sensible defaults, overrides, and reusable modules.
  • BERJAYA
    nixpkgs ecosystem
    Tap into fetchgit, fetchurl, writers, and pin Terraform / OpenTofu versions and providers reproducibly.
  • BERJAYA
    Documentation generator
    Generate JSON or man-page documentation straight from your config.nix module options.