Использование общих переменных Terraform в модулях

Я пишу сценарий terraform для создания ASG на AWS. Я попытался создать его с помощью terraform module, чтобы получить более удобный для повторного использования код. Проблема в том, что когда я хочу использовать переменную из common-variable.tfvars в tf-файлах модуля, он постоянно говорит, что она не определена и должна быть объявлена. Таким образом, модуль будет менее пригоден для повторного использования.

Вот пример

root
|
|___project 1
|     |_____ main.tf
|     |_____ common-variable.tfvars
|
|___ modules
      |
      |_____ a-module
                 |______ main.tf

Итак, внутри проекта 1 common-variable.tfvars, в основном это выглядит так

variable "a" { 
    description = "a variable"
    default = "a" 
}

variable "b" { 
    description = "a variable"
    default = "b" 
}

Внутри a-module / main.tf выглядит так

variable "name" {}

resource "aws_autoscaling_group" "asg-1" {
    name = "${var.a}"
    ...
}

Когда я выполняю terraform init, он говорит

resource 'aws_autoscaling_group.asg-1' config: unknown variable 
referenced: 'a'. define it with 'variable' blocks

Любая идея, как я могу использовать эту общую переменную из основного модуля .tf?


Обновлять

Мне удалось пройти terraform init, повторно объявив переменную в каждом модуле. Однако, когда я запускаю terraform plan, появляется такая ошибка invalid value "common-variable.tfvars" for flag -var-file: multiple map declarations not supported for variables


person Reynaldi Wijaya    schedule 18.08.2017    source источник


Ответы (2)


Неверный формат tfvars, должен быть только ключ / значение, например:

a = "a"
b = "b"

Во-вторых, проверьте, как вы относитесь к модулю, должно быть примерно так:

source = "../modules/a-module"
person BMW    schedule 18.08.2017
comment
привет спасибо за ответ. Но variable a на самом деле содержит больше, чем просто значение, как отредактировано выше. некоторые из переменных также являются картой, которую, я думаю, мне нужно указать type = "map"? - person Reynaldi Wijaya; 18.08.2017
comment
для карты вы можете определить его в файле tfvars как map = { us-east-1 = "image-1234", us-west-2 = "image-4567"} - person BMW; 18.08.2017

Вам необходимо объявить переменные, требуемые модулем, внутри модуля, а затем передать их при создании экземпляра модуля из вашего проекта.

Пример, украденный из документации hashicorp

В вашем проекте:

module "assets_bucket" {
  source = "./publish_bucket"
  name   = "assets"
}

module "media_bucket" {
  source = "./publish_bucket"
  name   = "media"
}

В вашем модуле:

# publish_bucket/bucket-and-cloudfront.tf

variable "name" {} # this is the input parameter of the module

resource "aws_s3_bucket" "the_bucket" {
  # ...
}

resource "aws_iam_user" "deploy_user" {
  # ...
}
person Matt Childs    schedule 25.08.2017