Terraform模块中的常见变量用法

时间:2017-08-18 02:11:14

标签: terraform

我正在编写terraform脚本以在AWS上创建ASG。我尝试使用terraform module创建它以获得更可重用的代码。问题是当我想在模块tf文件中使用来自common-variable.tfvars的变量时,它一直说它是未定义的并且需要声明。这样,模块的可重用性就会降低。

这是一个例子

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

我知道如何在模块main .tf中使用这个公共变量吗?

更新

我设法通过重新声明每个模块中的变量来传递terraform init。但是,当我运行terraform plan时,会出现invalid value "common-variable.tfvars" for flag -var-file: multiple map declarations not supported for variables

这类错误

2 个答案:

答案 0 :(得分:0)

错误的tfvars格式,应仅为键/值,例如:

a = "a"
b = "b"

其次,检查你如何引用该模块,应该是这样的:

source = "../modules/a-module"

答案 1 :(得分:0)

您需要在模块中声明模块所需的变量,然后在从项目实例化模块时传入它们。

hashicorp documentation

中窃取的示例

在您的项目中:

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" {
  # ...
}