Terraform. Карта в тфварс в модуле - PullRequest
2 голосов
/ 21 апреля 2020

Я пишу модуль terraform, который будет выбирать значение на карте на основе переданного ему ключа. Ничего необычного.

Однако значения на этой карте являются секретными и не меняются в зависимости от того, кто вызывает модуль. Простой способ сохранить эти секреты в секрете состоит в том, чтобы определить переменную как карту в файле variables.tf в модуле, поместить ключи / значения в файл terraform.tfvars в модуле, .gitignore terraform.tfvars и зашифровать его в terraform.tfvars.gpg или что-то в этом роде.

Но это не сработает, потому что у меня нет значения по умолчанию для переменной в модуле. terraform ожидает, что переменная будет установлена ​​вызывающей стороной. Я могу определить переменную в вызывающей стороне без значения, добавить ее к вызову и либо указать вручную --var-file, либо включить terraform.tfvars в вызывающую программу. Но это означает, что пользователь должен помнить вызов magi c --var-file или дублирование terraform.tfvars везде, где используется мой новый модуль. Запоминание строк и дублирования magi c не являются хорошими вариантами.

Возможно ли для модуля использовать его собственные tfvars для заполнения переменных, которые ему не передаются?

Ответы [ 2 ]

1 голос
/ 23 апреля 2020

Невозможно использовать автоматический c .tfvars файл с модулем, отличным от root. Дочерние модули всегда получают все свои значения из вызывающего блока module (при необходимости вставляются значения default); .tfvars предназначен только для присвоения значений root переменным модуля.

Другой вариант, характеристики которого аналогичны описанным, заключается в использовании файла данных в формате JSON или YAML внутри каталога модуля. и загрузите его, используя функцию file и одну из функций декодирования. Например:

locals {
  # This file must be created before using this module by
  # decrypting secrets.yaml.gpg in this directory.
  secrets = yamldecode(file("${path.module}/secrets.yaml"))
}

Если вызывающая сторона не расшифровывает файл .gitignore d перед использованием модуля, то вызов file завершится неудачно с сообщением об ошибке «файл не найден».

0 голосов
/ 23 апреля 2020

Я не совсем уверен, что понимаю, но беру удар. Вы используете AWS? Забавное решение, которое я использовал в прошлом, - это параметры SSM.

data "aws_ssm_parameter" "foo" {
  name  = "foo"
}

...
  value = data.aws_ssm_parameter.foo.value
...

Параметр SSM может быть создан вне tf и найден в вашем модуле (и политики, предоставляющие доступ в зависимости от вызывающего абонента через IAM, или что угодно).

...