Хранить версии «Provider» и «Terraform» в отдельном файле TF?

#terraform #provider

#terraform #поставщик

Вопрос:

В настоящее время я должен определить версию Terraform и версию Provider в каждом из моих шаблонов Terraform.

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

Я рассматривал возможность использования файла переопределений (https://www.terraform.io/docs/configuration/override.html ), но, похоже, мне придется определить весь блок Terraform / Provider из каждого шаблона в override.tf файле. Мне бы очень хотелось просто иметь возможность указать Terraform посмотреть (псевдофайл) versions.tf , например, чтобы получить необходимые версии для каждого шаблона.

Таким образом, что-то вроде этого было бы желаемой (упрощенной) структурой каталогов:

  terraform
     ├── dev
     │   └── main.tf
     ├── prod
     │   └── main.tf
     ├── stg
     │   └── main.tf
     └── versions.tf
 

Прямо сейчас должна быть только одна версия поставщика и одна версия Terraform, определенная в versions.tf

Можно ли таким образом передать версию Provider / Terraform в шаблоны?

Комментарии:

1. Есть ли какая-либо причина, по которой эти каталоги не могут быть рабочими пространствами? Это решило бы вашу проблему и другие.

Ответ №1:

Если вы не хотите использовать рабочие пространства Terraform, создайте символическую ссылку в каждом подкаталоге, указывающую на versions.tf файл.

Например, если ваша структура:

 terraform
     ├── dev
     │   └── main.tf
     ├── prod
     │   └── main.tf
     ├── stg
     │   └── main.tf
     └── versions.tf
 

И вы хотите, чтобы каждый подкаталог ( dev , prod , stg ) указывал на versions.tf файл в корневом terraform каталоге, создайте символическую ссылку в каждом подкаталоге:

 ln -sf terraform/versions.tf terraform/dev/versions.tf
ln -sf terraform/versions.tf terraform/prod/versions.tf
ln -sf terraform/versions.tf terraform/stg/versions.tf
 

Ваша окончательная структура была бы:

 terraform
     ├── dev
     │   └── main.tf
     │   └── versions.tf -> ../versions.tf
     ├── prod
     │   └── main.tf
     │   └── versions.tf -> ../versions.tf
     ├── stg
     │   └── main.tf
     │   └── versions.tf -> ../versions.tf
     └── versions.tf
 

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

 terraform
     ├── main.tf
     └── versions.tf
 

И рабочее пространство для каждой среды, которое вы создаете, выполняя:

 terraform workspace new dev
 

Затем вы используете интерполяцию terraform для выполнения чего-то другого в зависимости от того, в какой среде вы работаете, состояния terraform также сохраняются отдельно для каждого рабочего пространства.

Поэтому, если вы хотите поработать над окружающей dev средой, вы переключаетесь на нее:

 terraform workspace select dev
 

Комментарии:

1. Я действительно использую рабочие пространства, но не совсем уверен, как это решает эту проблему. Не могли бы вы уточнить? Точно так же, как вы могли бы добиться этого с помощью символических ссылок?

2. @xyz1234 Я отредактировал свой ответ, добавив еще немного информации.

3. Спасибо за разъяснение. Я понимаю, о чем ты говоришь. Таким образом, похоже, что мне нужно было бы определить блоки моего провайдера, блоки terraform, блоки remote_state для каждого шаблона в versions.tf , правильно?