!UKDpaKNNsBpOPfLWfX:zhaofeng.li

Colmena

309 Members
A simple, stateless NixOS deployment tool - https://github.com/zhaofengli/colmena109 Servers

Load older messages


SenderMessageTime
11 Jul 2022
@jairo:recallstack.icuJairo Llopis Hi folks! I'm new to colmena and I like that it seems well maintained, fast, flake-oriented, easy and stateless. Cool!
However, regarding the stateless part, I like it because I actually keep state elsewhere: in Terraform.
Until today, I got wired a Terraform output with a one-line Ansible dynamic inventory script and it has worked very nice until now: terraform generates the inventory and Ansible consumes it and applies roles.
Moving to Colmena means dumping Ansible. How can I feed a dynamic inventory into Colmena? Does it have such concept? Or maybe I'm misunderstanding something...
11:07:08
@schnecfk:ruhr-uni-bochum.deCRTified If you can use JSON as terraform output, you could try using builtins.fromJSON to generate your system configs "on the fly". That's probably more on the nix-side than on the colmena one 11:09:23
@schnecfk:ruhr-uni-bochum.deCRTifiedAt least that's what I'd probably do (but I do not use terraform, so my understanding of that part might be a bit limited)11:09:51
@jairo:recallstack.icuJairo LlopisYes, that was my initial thought. I'm just wondering if the pure nature of flakes will just build that script once and never execute it again. 🤔11:11:26
@jairo:recallstack.icuJairo LlopisIt'd be an IFD in any case, I hope also that's no problem11:11:45
@jairo:recallstack.icuJairo Llopislet me do some tests11:11:58
@schnecfk:ruhr-uni-bochum.deCRTified

So right now I'd imagine a workflow similar to:

  1. Terraform creates the infrastructure
  2. Terraform generates a json output of that infrastructure
  3. nix/colmena consumes it to generate the appropriate config (I'd guess mainly modifying the deployment-keys, while keeping the larger portion of the config in "pure" config files) - this might require impure flake evaluation
  4. colmena deploys the config
11:14:22
@schnecfk:ruhr-uni-bochum.deCRTifiedPlease correct me if that is wrong 😄11:14:32
@jairo:recallstack.icuJairo Llopisit should work11:15:00
@jairo:recallstack.icuJairo LlopisHow to use impure flake evaluation?11:15:11
@schnecfk:ruhr-uni-bochum.deCRTifiediirc colmena defaults to it11:15:57
@jairo:recallstack.icuJairo Llopisah!11:16:05
@schnecfk:ruhr-uni-bochum.deCRTified Otherwise, most nix tools use --impure 11:16:06
@jairo:recallstack.icuJairo Llopisgood11:16:10
@jairo:recallstack.icuJairo Llopisok let me try11:16:13
@schnecfk:ruhr-uni-bochum.deCRTifiedit mainly means that the git tree for the config might contain uncommited changes11:16:32
@schnecfk:ruhr-uni-bochum.deCRTifiedBut I don't know whether the terraform json output should be tracked by git 🤔11:16:49
@schnecfk:ruhr-uni-bochum.deCRTified * But I don't know whether the terraform json output should be tracked by git 🤔 (to make it pure)11:16:57
@jairo:recallstack.icuJairo Llopisit shouldn't11:16:58
@jairo:recallstack.icuJairo Llopis see, with the same Terraform declarations I can run terraform apply or terraform destroy 11:17:26
@jairo:recallstack.icuJairo Llopis

So let's say:

  1. apply. HostA IP = 1.1.1.1
  2. destroy
  3. apply. HostA IP = 1.1.1.2
11:18:05
@jairo:recallstack.icuJairo Llopisthat's why Terraform keeps the state outside git (and for other reasons), and why this can't be pure to be usable11:18:28
@jairo:recallstack.icuJairo LlopisWell, I could git-commit the terraform output anyway 😆11:18:40
@jairo:recallstack.icuJairo LlopisBut direct linking to terraform state seems more useful imho (I might be wrong)11:19:04
@jairo:recallstack.icuJairo Llopis

well... just like I was expecting, it doesn't work. 😕
In my flake, I have:

let inventory = builtins.fromJSON (
      builtins.readFile
      (
        pkgs.runCommandLocal "terraform-inventory" {
          src = ./.;
        } ''
          export PATH=${self.outputs.devShells.${pkgs.system}.default}/bin:$PATH
          bash $src/ansible/inventories/terraform.sh > $out
        ''
      )
    );
in colmena = { ... } # Stuff that parses the inventory and generates machine info

The results, as I was expecting:

> colmena build
warning: Git tree '/var/home/yajo/prodevel/moduground' is dirty
[INFO ] Using flake: git+file:///var/home/yajo/prodevel/moduground
[INFO ] Enumerating nodes...
warning: Git tree '/var/home/yajo/prodevel/moduground' is dirty
building '/nix/store/pa4n1x0ncgw669zyksz89kwflpr51nl8-terraform-inventory.drv'...
â•·
│ Error: Backend initialization required, please run "terraform init"
│ 
│ Reason: Initial configuration of the requested backend "http"
[...]

Basically it means that it's trying to build that inventory as a normal derivation, in isolation. Thus, it doesn't get the necessary environmental secrets that Terraform uses to access its state, and fails.

The dynamic inventory should be evaluated outside of the nix expression, and maybe passed in as an argument. But my guess is that this would be common enough so as to colmena needing to add support for it out of the box somehow, right?

12:34:06
@buckley310:matrix.orgBuckleySo wait, is there a pure evaluation mode?13:54:48
@buckley310:matrix.orgBuckleyThat sounds nice13:55:02
@linus:schreibt.jetztLinux Hackermannot for colmena AFAIK13:55:18
@jairo:recallstack.icuJairo LlopisI'm using flakes, that's pure by default AFAIK 13:56:59
@linus:schreibt.jetztLinux Hackermannot with colmena13:57:10

There are no newer messages yet.


Back to Room ListRoom Version: 6