Как лучше всего обрабатывать несколько файлов .tfvars, которые используют общие файлы .tf? - PullRequest
1 голос
/ 06 февраля 2020

Я собираюсь управлять конфигурациями CDN десятков приложений через Terraform. У меня есть набор .tf файлов, содержащих все постоянные настройки по умолчанию, которые являются общими для всех конфигураций, а затем у каждого приложения есть собственный файл .tfvars для хранения его уникальных настроек.

Если я запускаю что-то вроде terraform apply --var-file=app1.tfvars --var-file=app2.tfvars --var-file=app3.tfvars, тогда используется только последний переданный файл.

Даже если это сработало, оно станет неуправляемым, когда я распространю это на другие сайты.

Как правильно включить несколько файлов .tfvars, которые заполняют общий набор файлов .tf?

Редактировать: я должен добавить, что файлы .tfvar определяют одни и те же переменные но с разными значениями. Мне нужно объявить состояние ресурсов, определенных в файлах .tf, один раз для каждого файла .tfvar.

Ответы [ 2 ]

1 голос
/ 12 февраля 2020

Я нашел лучший способ справиться с этим делом (без использования сторонних инструментов - это использовать) рабочие пространства Terraform и создать отдельное рабочее пространство для каждого файла .tfvars. Таким образом, я могу использовать одни и те же общие файлы .tf и просто переключаться на другое рабочее пространство с помощью terraform workspace select <workspace name> перед запуском terraform apply --var-file=<filename> с каждым отдельным файлом .tfvars.

1 голос
/ 06 февраля 2020

Лучшим способом может быть использование TerraGrunt https://terragrunt.gruntwork.io/ от GruntWork, который представляет собой тонкую оболочку для Terraform, вы можете использовать файл конфигурации HCL для определения ваших требований.

Пример Конфигурация terragrunt.hcl:

terraform {
  extra_arguments "conditional_vars" {
    commands = [
      "apply",
      "plan",
      "import",
      "push",
      "refresh"
    ]

    required_var_files = [
      "${get_parent_terragrunt_dir()}/terraform.tfvars"
    ]

    optional_var_files = [
      "${get_parent_terragrunt_dir()}/${get_env("TF_VAR_env", "dev")}.tfvars",
      "${get_parent_terragrunt_dir()}/${get_env("TF_VAR_region", "us-east-1")}.tfvars",
      "${get_terragrunt_dir()}/${get_env("TF_VAR_env", "dev")}.tfvars",
      "${get_terragrunt_dir()}/${get_env("TF_VAR_region", "us-east-1")}.tfvars"
    ]
  }

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

...