← Назад к вопросам

Какой приоритет использования переменных (variables) в Terraform?

1.8 Middle🔥 241 комментариев
#Облачные технологии

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Приоритет использования переменных (variables) в Terraform

Приоритет использования переменных в Terraform определяет порядок, в котором значения переменных могут быть заданы, и как они взаимодействуют между разными источниками. Этот механизм позволяет эффективно управлять конфигурациями в различных сценариях — от локальной разработки до сложных производственных развертываний с множеством сред.

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

Официальный порядок приоритета (от высшего к низшему)

  1. Переданные через аргумент -var или -var-file (высший приоритет в текущем запуске).
  2. Значения из файла terraform.tfvars (или любого файла с именем, завершающимся на .auto.tfvars).
  3. Значения из файла terraform.tfvars.json (или любого файла с именем, завершающимся на .auto.tfvars.json).
  4. Значения из переменных окружения (environment variables).
  5. Значения из файлов переменных, переданных через -var-file (в порядке их указания, если они не были указаны в пункте 1).
  6. Значения по умолчанию (default values) в блоке определения переменной внутри конфигурации (самый низкий приоритет).

Ключевое правило: Любое значение, заданное с более высоким приоритетом, переопределяет значение с более низким приоритетом. Значения по умолчанию используются только если переменная не задана никаким другим способом.

Примеры и практическое применение

Рассмотрим блок определения переменной:

# variables.tf
variable "instance_type" {
  description = "The type of EC2 instance"
  type        = string
  default     = "t3.micro"
}

Сценарий 1: Использование значения по умолчанию Если мы не зададим значение instance_type ни одним из вышеперечисленных способов, Terraform будет использовать значение по умолчанию ("t3.micro").

Сценарий 2: Переопределение через terraform.tfvars Создадим файл terraform.tfvars:

# terraform.tfvars
instance_type = "t3.large"

При запуске terraform apply переменная получит значение "t3.large", переопределяя значение по умолчанию.

Сценарий 3: Переопределение через переменную окружения Установим переменную окружения перед запуском Terraform (имена переменных окружения должны начинаться с TF_VAR_):

export TF_VAR_instance_type="t3.xlarge"

Это значение ("t3.xlarge") переопределит и значение из terraform.tfvars, и значение по умолчанию.

Сценарий 4: Переопределение через аргумент CLI (высший приоритет):

terraform apply -var="instance_type=t3.nano"

Значение "t3.nano", заданное через -var, будет иметь наивысший приоритет и переопределит все другие источники для этого конкретного запуска.

Почему этот порядок критически важен для DevOps

  • Разделение конфигураций по окружениям (environments): Для разных окружений (dev, staging, prod) можно использовать разные файлы .tfvars или разные значения переменных окружения, сохраняя единую базовую конфигурацию в основном коде Terraform.
  • Секретное управление (secret management): Чувствительные данные (пароли, ключи API) никогда следует хранить в коде или файлах .tfvars, которые могут попасть в репозиторий. Их безопасно задавать через переменные окружения или специализированные системы (например, через -var-file с файлом, который не хранится в репо).
  • Специальные запуски (ad-hoc executions): Аргументы -var позволяют быстро изменять параметры для единичных запусков без модификации файлов конфигурации — например, для тестирования новой версии инстанса.
  • Автоматизация и CI/CD: В pipelines CI/CD значения переменных удобно инжектировать через переменные окружения (например, TF_VAR_environment = $CI_ENVIRONMENT_NAME), обеспечивая чистоту и контролируемость процесса.

Практические рекомендации и шаблон использования

Для создания масштабируемой и безопасной конфигурации я рекомендую следующий шаблон:

  • Основной код: Определять все переменные в variables.tf с четкими description, type и безопасными значениями по умолчанию для разработки.
  • Окружение-специфичные значения: Использовать файлы .tfvars для каждого окружения (например, dev.tfvars, prod.tfvars) и выбирать их через -var-file в CI/CD или локально.
  • Секреты: Все секреты задавать только через переменные окружения или через интеграцию с vault (например, HashiCorp Vault).
  • Локальная разработка: Для локальной разработки можно создать персональный файл terraform.tfvars.local (не добавлять его в репозиторий!), который будет автоматически загружен (как .auto.tfvars) и переопределит значения по умолчанию, но не переопределит значения из CI/CD.
# Пример запуска для production с CI/CD pipeline
terraform apply -var-file="production.tfvars"
# Значения из production.tfvars переопределяют значения по умолчанию,
# но секреты из переменных окружения (TF_VAR_db_password) переопределяют production.tfvars.

Таким образом, понимание и грамотное применение приоритета переменных позволяет создавать гибкие, безопасные и легко поддерживаемые инфраструктурные конфигурации в Terraform, что является ключевым навыком для DevOps Engineer.

Какой приоритет использования переменных (variables) в Terraform? | PrepBro