Выбрать главу

variable "NAME" {

  [CONFIG ...]

}

Тело объявления переменной может содержать три необязательных параметра.

•description. Этот параметр всегда желательно указывать для документирования того, как используется переменная. Ваши коллеги смогут просмотреть это описание не только при чтении кода, но и во время выполнения команд plan или apply (пример этого показан чуть ниже).

• default. Вы можете присвоить значение переменной несколькими способами, в том числе через командную строку (с помощью параметра -var), файл (указывая параметр -var-file) или переменную среды (Terraform ищет переменные среды вида TF_VAR_<имя_переменной>). Если переменная не инициализирована, ей присваивается значение по умолчанию. Если такого нет, Terraform запросит его у пользователя в интерактивном режиме.

•type. Позволяет применить к переменным, которые передает пользователь, ограничения типов. Terraform поддерживает ряд ограничений для таких типов, как string, number, bool, list, map, set, object, tuple и any. Если тип не указан, Terraform воспринимает значение как any.

Вот пример входной переменной, которая проверяет, является ли передаваемое значение числом:

variable "number_example" {

  description = "An example of a number variable in Terraform"

  type        = number

  default     = 42

}

А вот пример переменной, которая проверяет, является ли значение списком:

variable "list_example" {

  description = "An example of a list in Terraform"

  type        = list

  default     = ["a", "b", "c"]

}

Ограничения типов можно сочетать. Например, вот входная переменная, которая принимает список и требует, чтобы все значения этого списка были числовыми:

variable "list_numeric_example" {

  description = "An example of a numeric list in Terraform"

  type        = list(number)

  default     = [1, 2, 3]

}

А вот ассоциативный массив, который требует, чтобы все значения были строковыми:

variable "map_example" {

  description = "An example of a map in Terraform"

  type        = map(string)

  default = {

    key1 = "value1"

    key2 = "value2"

    key3 = "value3"

  }

}

Вы также можете создавать более сложные структурные типы, используя ограничения object и tuple:

variable "object_example" {

  description = "An example of a structural type in Terraform"

  type        = object({

    name    = string

    age     = number

    tags    = list(string)

    enabled = bool

  })

  default   = {

    name    = "value1"

    age     = 42

    tags    = ["a", "b", "c"]

    enabled = true

  }

}

Выше создается входная переменная, которая требует, чтобы значение было объектом с ключами name (строка), age (число), tags (список строк) и enabled (булево значение). Если попытаться присвоить такой переменной значение, которое не соответствует этому типу, Terraform немедленно вернет ошибку типизации. В следующем примере демонстрируется попытка присвоить enabled строку вместо булева значения:

variable "object_example_with_error" {

  description = "An example of a structural type in Terraform with an error"

  type        = object({

    name    = string

    age     = number

    tags    = list(string)

    enabled = bool

  })

  default   = {

    name    = "value1"

    age     = 42

    tags    = ["a", "b", "c"]

    enabled = "invalid"

  }

}

Вы получите следующую ошибку:

$ terraform apply

Error: Invalid default value for variable

  on variables.tf line 78, in variable "object_example_with_error":

  78:   default   = {

  79:     name    = "value1"

  80:     age     = 42

  81:     tags    = ["a", "b", "c"]

  82:     enabled = "invalid"

  83:   }

This default value is not compatible with the variable's type constraint: a bool is required.

Для примера с веб-сервером достаточно переменной, которая хранит номер порта:

variable "server_port" {

  description = "The port the server will use for HTTP requests"

  type        = number

}

Обратите внимание, что у входной переменной server_port нет поля default, поэтому, если выполнить команду apply прямо сейчас, Terraform сразу же попросит ввести значение для server_port и покажет вам описание description:

$ terraform apply

var.server_port

  The port the server will use for HTTP requests

  Enter a value:

Если вы не хотите иметь дело с интерактивной строкой ввода, можете предоставить значение переменной с помощью параметра командной строки -var:

$ terraform plan -var "server_port=8080"

То же самое можно сделать, добавив переменную среды вида TF_VAR_<name>, где name — имя переменной, которую вы хотите установить:

$ export TF_VAR_server_port=8080

$ terraform plan

Если же вы не хотите держать в голове дополнительные аргументы командной строки при каждом выполнении команды plan или apply, можете указать значение по умолчанию:

variable "server_port" {

  description = "The port the server will use for HTTP requests"

  type        = number

  default     = 8080

}

Чтобы использовать значение входной переменной в коде Terraform, следует воспользоваться выражением типа «ссылка на переменную», которое имеет следующий синтаксис:

var.<VARIABLE_NAME>

Например, так можно присвоить параметрам группы безопасности from_port и to_port значение переменной server_port: