Получить тип переменной в Terraform - PullRequest
1 голос
/ 10 октября 2019

Есть ли способ определения типа переменной в Terraform? Скажем, у меня есть входная переменная модуля типа any, могу ли я сделать какое-то переключение, в зависимости от типа?

variable "details" {
  type = any
}

local {
  name = var.details.type == map ? var.details["name"] : var.details
}

То, что я хочу заархивировать, это чтобы передать либоСтрока как сокращение или сложный объект с дополнительными ключами.

module "foo" {
  details = "my-name"
}

или

module "foo" {
  details = {
    name = "my-name"
    age = "40"
  }
}

Я знаю, что этот пример не имеет большого смысла, и вы хотели быпредложить вместо этого использовать две входные переменные со значениями по умолчанию. Этот пример просто сведен к минимальному (не) рабочему примеру. Конечная цель - получить список операторов политики IAM, поэтому это будет список списков объектов.

1 Ответ

1 голос
/ 10 октября 2019

В Terraform отсутствует механизм переключения поведения на основе типов. Обычно Terraform предпочитает выбирать определенные типы так, чтобы вызывающие модули всегда были согласованными, и Terraform может полностью проверить заданные значения, даже если в более простых случаях это означает небольшую дополнительную детализацию.

Я бы рекомендовал просто определить details какобъект и наличие вызывающего явно выписать объект с атрибутом name, чтобы быть более явным и последовательным:

variable "details" {
  type = object({
    name = string
  })
}
module "example" {
  source = "./modules/example"

  details = { name = "example" }
}

Если вам нужно для поддержки двухразличных типов, самым близким в языке Terraform было бы определить две переменные и определить, какая из них является null:

variable "details" {
  type = object({
    name = string
  })
  default = null
}

variable "name" {
  type    = string
  default = null
}

local {
  name = var.name != null ? var.name : var.details.name
}

Однако, поскольку в настоящее время нет способа выразить это точно одной из этих двухдолжна быть указана, конфигурация модуля, которую вы пишете, должна быть готова иметь дело с возможностью того, что оба будут установлены (в вышеприведенном примере var.name имеет приоритет) или что ни один из них не будет установлен (в вышеприведенном примере выражение будет производитьошибка, но не очень удобная для вызывающих абонентов).

...