List — "списки", упорядоченные коллекции элементов
Map — "словари", пары "ключ-значение"
Object — структурированные данные с несколькими атрибутами
С простыми все понятно и без объяснений, то с составными разберем синтаксис
После ключевого слова variable указано имя переменной, а в скобках - значение
Доп возможности
sensitive - скрывать значение переменной в выводе terraform apply и terraform plan:
sensitive = true
Указывайте sensitive = true для секретов, паролей, токенов и тд
Или хранените секреты в переменные окружения
Не забывайте про параметр, чтоб не вывести значение в консоль или в output-переменные
nullable - защита от пустых значений:
nullable = false
Если переменная объявлена, но не определена и у неё нет значения по умолчанию:
При запуске terraform apply потребует ввести для нее значение в интерактивном режиме
Приоритеты переменных (по убыванию приоритета):
-var при вызове в консоли
-var-file
terraform.tfvars
Переменные окружения
Значения по умолчанию
List
Пример (список строк, содержащих подсети):
variable "subnets" {
type = list(string)
# default определяет значение по умолчанию, можно переопределить позже
default = ["192.168.1.0/24", "192.168.2.0/24"]
}
Нумерация списка начинается с нуля, пример обращения к элементу списка:
var.subnets[0]
Map
Пример (значения для дефолтного репозитория gitlab):
variable "repo_vars" {
type = map(number)
default = {
name = "default_user"
description = "Default repo"
namespace_id = 1
}
}
Пример обращения к элементам словаря:
resource "gitlab_project" "repo_name" {
name = var.repo_vars["name"]
description = var.repo_vars["description"]
namespace_id = var.repo_vars["namespace_id"]
}
Object
Пример 1 переменной-объекта с переменными разного типа:
variable "settings" {
type = object({
id = number
name = string
})
# default определяет значение по умолчанию, можно переопределить позже
default = {
id = 1
name = "root"
}
}
Обращение к значениям объекта:
var.settings.id
var.settings.name
Пример 2 переменной-объекта с вложенной object:
variable "settings" {
type = object({
name = string
tags = map(string)
enabled = bool
network_settings = object({
ip = string
ports = list(number)
})
})
default = {
name = "www_server"
tags = {
env = "dev"
proj = "test_project"
}
enabled = true
network_settings = {
ip = "192.168.1.1/24"
ports = [80, 443]
}
}
}
Обращение к значениям объекта:
var.settings.name
var.settings.tags["env"]
var.settings.tags["proj"]
var.settings.enabled
var.settings.network_settings.ip
var.settings.network_settings.security_groups
Input-переменные
Аналог - принимаемые функцией аргументы
В отдельном файле переменных можно хранить чувствительные данные, добавив его в .gitignore
Например пароли, логины, и тд
Имеют уже знакомые выше доп. атрибуты:
default — значение по умолчанию
type — тип переменной
description — описание переменной
validation — блок правил проверки (пример ниже)
variable "repo_description" {
type = string
description = "Тип проекта"
validation {
condition = contains(["dev", "prod"], var.repo_description)
error_message = "Выберите тип проекта: dev или prod"
}
}
Пример обращения:
resource "gitlab_project" "repo_name" {
name = "test"
description = var.repo_description
namespace_id = 1
}
Способ передачи input-переменных с помощзью файла с расширением *.tfvars
Файл с именем terraform.tfvars загрузится автоматически
Описывается множество переменных как ключ = значение
Пример структуры проекта:
/
├ main.tf # Манифест
├ variables.tf # Файл переменных
├ terraform.tfvars # Значения по умолчанию, загрузятся автоматически
└ env/
├ dev.tfvars # Значения для dev
└ prod.tfvars # Значения для prod
Пример запуска манифеста для dev и prod:
terraform apply -var-file="env/dev.tfvars"
terraform apply -var-file="env/prod.tfvars"
Ключ -var-file может указываться несколько раз
Значения последнего файла будут иметь приоритет
Пример, определение или переопределение переменной:
terraform apply -var="var_name=var_value"
Определение переменной с помощью переменной окружения с префиксом TF_VAR_:
export TF_VAR_var_name="var_value"
Output-переменные
Аналог - возвращаемые функцией аргументы
Для использования в конфигурации можно определить в отдельном файле output.tf
Пример, вернуть информацию о назначенных ip адресах созданного сервера
variables.tf:
variable "do_token" {
description = "DigitalOcean API Token"
type = string
sensitive = true
}
terraform.tfvars:
do_token = "your_digitalocean_token_here"
# !!!!!!!!Добавь terraform.tfvars в .gitignore!!!!!!!!
tags = ["web", "terraform"]
}
# Обращение за назначенным ip созданной вм
output "droplet_ip" {
value = digitalocean_droplet.web.ipv4_address
}
# Инициализация проекта
terraform init
# Проверка конфигурации
terraform validate
# Планирование изменений
terraform plan Пример вывода terraform plan: Changes to Outputs: + droplet_ip = (known after apply)
# Применение изменений
terraform apply
# Просмотр состояния
terraform show
# Просмотр output-переменных из текущего файла состояния:
terraform output
# Просмотр конкретной переменной:
terraform output <имя_переменной>
# Удаление всех ресурсов
terraform destroy
Создание файла из вывода, пример ip для ansible формата:
output "ip_to_ansible" {
value = <<EOT
[servers]
${yandex_compute_instance.vm_name.network_interface[0].nat_ip_address}
EOT
}
Создание файла:
terraform output -raw ip_to_ansible > inventory.ini
Local-переменные
Аналог - переменные внутри функции
Не заменяют Input-переменные, используются для локальной логики
бращение к локальной переменной - local.<имя_переменной>
Пример 1:
locals {
x = 2
y = 1
total = local.x - local.y
}