Getting started with flakes
Nix flakes make dependency management of modules and packages much easier.
Quick start from template
The fastest way to get started is with the terranix flake template:
nix flake init --template github:terranix/terranix-examples
This creates a flake.nix and config.nix you can build right away.
A minimal flake.nix
Extending Getting started, this minimal flake defines your terranix resources in config.nix:
{
inputs = {
terranix.url = "github:terranix/terranix";
terranix.inputs.nixpkgs.follows = "nixpkgs";
};
outputs = { terranix, ... }:
let
system = "x86_64-linux";
in
{
defaultPackage.${system} = terranix.lib.terranixConfiguration {
inherit system;
modules = [ ./config.nix ];
};
};
}
nix build
Instead of terranix config.nix > config.tf.json, you can run nix build -o config.tf.json:
nix build -o config.tf.json
tofu init
tofu apply
Use terraform or tofu if you installed either of them plainly.
nix run
You can create Nix flake apps that let you run:
nix runnix run .#applynix run .#destroy
{
inputs = {
nixpkgs.url = "github:nixos/nixpkgs";
terranix.url = "github:terranix/terranix";
terranix.inputs.nixpkgs.follows = "nixpkgs";
};
outputs = { self, nixpkgs, terranix, ... }:
let
system = "x86_64-linux";
pkgs = nixpkgs.legacyPackages.${system};
terraform = pkgs.terraform;
terraformConfiguration = terranix.lib.terranixConfiguration {
inherit system;
modules = [ ./config.nix ];
};
in
{
# nix run ".#apply"
apps.${system} = {
apply = {
type = "app";
program = toString (pkgs.writers.writeBash "apply" ''
if [[ -e config.tf.json ]]; then rm -f config.tf.json; fi
cp ${terraformConfiguration} config.tf.json \
&& ${terraform}/bin/terraform init \
&& ${terraform}/bin/terraform apply
'');
};
# nix run ".#destroy"
destroy = {
type = "app";
program = toString (pkgs.writers.writeBash "destroy" ''
if [[ -e config.tf.json ]]; then rm -f config.tf.json; fi
cp ${terraformConfiguration} config.tf.json \
&& ${terraform}/bin/terraform init \
&& ${terraform}/bin/terraform destroy
'');
};
};
# nix run
defaultApp.${system} = self.apps.${system}.apply;
};
}
Writing terranix modules
You can scaffold a new terranix module with:
nix flake init --template "github:terranix/terranix-examples#module"
A terranix module flake should provide the following outputs:
terranixModules.<name>— individual modulesterranixModule— allterranixModulescombined
The function lib.terranixOptions can render an options.json for your module,
which is useful for generating documentation. See the
terranix-module-github
repository for an example.
For more on the module system itself, see the Modules page.
As a next step, read terranix and flake modules to use flake-parts to manage terranix configurations declaratively