rodvictor
rodvictor

Reputation: 339

Assign provided value if variable/local does not exist

I would like to set the disk_size doing something like the following:

resource "google_compute_disk" "terraform-additional-persistent-disk" {
    name = "terraform-additional-persistent-disk"
    zone = local.zone
    type = local.default_disk_type
    size = exists(local.default_disk_size) ? local.default_disk_size : 50
    image = local.default_ubuntu_image
    labels = {
        created_by = "terraform"
    }
}

However, I have not been able to find a exists function in Terraform. The main aim is to take the value of a variable/local if it exists and, if it has not been declared anywhere, then take the value I pass as second argument.

I have been checking other questions like 1 but neither can nor try function are helping me achieve my goal. I will always get either A local value with the name "default_disk_size" has not been declared or An input variable with the name "default_disk_size" has not been declared (depending on whether I use a non-existing local or var).

I have even tried to run the following, but it will always raise an exception if the variable/local has not been set. Is there a way of achieving this without explicitly declaring the variable with a default value of null/""?

Thanks!

resource "google_compute_disk" "terraform-additional-persistent-disk" {
    name = "terraform-additional-persistent-disk"
    zone = local.zone
    type = local.default_disk_type
    size = merge({sizee=50}, {sizee = local.default_disk_sizee})["sizee"]
    image = local.default_ubuntu_image
    labels = {
        created_by = "terraform"
    }
}

Upvotes: 0

Views: 1748

Answers (1)

Mark B
Mark B

Reputation: 200486

I think you're coming at this with the idea that input variables and locals may or may not exist at the time this resource is created, like they are system environment variables or something. However in Terraform, those things have to be explicitly declared in one of the .tf files in the same folder as the file your google_compute_disk.terraform-additional-persistent-disk is declared.

There would be no way in Terraform's syntax to have either local or input variables appear dynamically at runtime, they have to be declared ahead of time in your code. They will always exist.

If you want to allow someone using your Terraform code the option of passing in a variable or not, you have to explicitly declare the variable, and give it a default value. Then the person using your Terraform code can optionally override that default value. Like this:

variable "disk_size" {
  type        = number
  default     = 50
  description = "The size of the additional persistent disk"
}

resource "google_compute_disk" "terraform-additional-persistent-disk" {
    name = "terraform-additional-persistent-disk"
    zone = local.zone
    type = local.default_disk_type
    size = var.disk_size
    image = local.default_ubuntu_image
    labels = {
        created_by = "terraform"
    }
}

Then when someone uses your Terraform code, if they don't specify a value for the disk_size input variable, the default of 50 will be used, but if they do specify something, then the value they specified will be used.

Upvotes: 1

Related Questions