如何在本地变量中进行变量定义?

时间:2020-10-21 15:41:24

标签: terraform

所以我有一个要像这样插值的变量:

variable "secondary_ranges" {
  type = map(object({
    secondary_range = object({
      range_name    = string
      ip_cidr_range = string
    })
  }))
  default = {
    pods = {
      secondary_range = {
        range_name    = "pods"
        ip_cidr_range = "${var.some_other_var_or_datasource}"
      }
    }
    services = {
      secondary_range = {
        range_name    = "services"
        ip_cidr_range = "${var.some_other_var_or_datasource}"
      }
    }
  }
}

我可以在本地人中执行此操作,但是我松开了自定义类型定义

locals {
  default = {
    pods = {
      secondary_range = {
        range_name    = "pods"
        ip_cidr_range = "${var.some_other_var_or_datasource}"
      }
    }
    services = {
      secondary_range = {
        range_name    = "services"
        ip_cidr_range = "${var.some_other_var_or_datasource}"
      }
    }
  }
}

是否可以在本地应用自定义类型?

1 个答案:

答案 0 :(得分:1)

通过包含一些类型转换函数(tomaptostring),可以使局部值最终具有符合该变量类型约束的类型:

locals {
  default = tomap({
    pods = {
      secondary_range = {
        range_name    = "pods"
        ip_cidr_range = tostring(var.some_other_var_or_datasource)
      }
    }
    services = {
      secondary_range = {
        range_name    = "services"
        ip_cidr_range = tostring(var.some_other_var_or_datasource)
      }
    }
  })
}

{ ... }语法创建对象类型的值,但是我们可以将此类对象传递给tomap,以使Terraform将其转换为等效的地图类型。通过检查所有对象属性值是否具有相同的类型,然后选择该类型作为地图的元素类型来做到这一点,因此只要内部对象具有正确的结构,结果值将具有相同的类型。 / p>

在上面的示例中,我通过对两个变量引用中的每一个使用tostring来帮助确保结果具有正确的类型。如果将该变量定义为type = string,实际上并不需要,因为Terraform仍然会自动将其转换为字符串,但是如果您关心生成特定的结果类型,则将其明确也不会造成损害。

可以设置类型约束来帮助模块的调用者知道如何调用它,因此对于模块本身内定义的值,它没有直接等效的功能,但是如果您使用类型转换功能,像上面一样,您可以通过不同的方式获得相同的结果。

我个人通常不会过分担心局部值的类型,因为无论如何它们只会在当前模块中使用,但是我将更明确地说明输出值中的类型转换,以便调用者可以得到更好的结果。发出有关如何使用该值的信号,以便将来的更改不太可能无意间导致输出值更改为其他类型。