terraform-provider-zerotier icon indicating copy to clipboard operation
terraform-provider-zerotier copied to clipboard

Networks gets renamed, if sequence of networks change - i.e. Given NW: A,C When B is added then C gets renamed to B

Open andreasmarkussen opened this issue 1 year ago • 2 comments

We tried the Zerotier Terraform Plugin/module and we have actually put it on pause because of a show stopper for us.

Imagine that we have defined the following networks in Terraform

Customer_A Customer_C

When we add a new Customer e.g. Customer_B, and we add it to e.g. a customers.tf file alphabetically, then Customer C, gets renamed to Customer_B and a new Customer_C is created.

It would be nice if we could mark that the Name is a unique identifier.

We have done a Plan and Apply so that the state file is correct.

terraform {
  required_providers {
    zerotier = {
      source  = "zerotier/zerotier"
      version = "1.4.2"
    }
  }
}

provider "zerotier" {
  # Configuration options
}

resource "zerotier_network" "customer_network" {
  count = length(var.customers)
  name  = "P${var.customers[count.index]["projectNumber"]} ${var.customers[count.index]["name"]} (${var.customers[count.index]["sequenceNumber"]})"

  route {
    target = "172.29.${var.customers[count.index]["sequenceNumber"]}.0/24"
  }
  assignment_pool {
    start = "172.29.${var.customers[count.index]["sequenceNumber"]}.220"
    end   = "172.29.${var.customers[count.index]["sequenceNumber"]}.250"
  }

  ## Administrators have to be set up manually via http://my.zerotier.com for now
  ## since we can get permissions working, and that is another thing we are missing

}

andreasmarkussen avatar Oct 03 '23 14:10 andreasmarkussen

Hello! Thank you for using our Terraform provider!

I'd love to help.

Unfortunately, this isn't specific to the ZeroTier provider.... This is a Terraform thing, You'll have the same problem with any provider. Long story short: Avoid using count. Count is the devil.

The "Modern Terraform Way" is to iterate over maps/objects, which will yield dynamic resource names, something like this:

resource "zerotier_network" "this" {
  for_each = var.customers_map
  name = each.value.name
  ...
  ...
}

One more thing... as you are aware, the zerotier_network resource is kind of funky to use in its raw form. We wrote a helper module to make it easier to use cidrhost() and cidrsubnet() Terraform functions. https://registry.terraform.io/modules/zerotier/network/zerotier/latest

Let me know if I can be of any more assistance!

-s

someara avatar Oct 03 '23 14:10 someara

If you haven't already, check out this repo https://github.com/zerotier/terraform-quickstart

someara avatar Oct 03 '23 14:10 someara

Closing this, as it's inactionable. Please avoid count and use dynamic keys

someara avatar Jul 26 '24 10:07 someara