【问题标题】:Passing terraform variable values from .tfvars file in the project folders to the module将项目文件夹中 .tfvars 文件中的 terraform 变量值传递给模块
【发布时间】:2019-04-24 11:54:12
【问题描述】:

以下是我的 AWS terraform 项目的文件夹结构:

c:\terraform
   ├─modules
   │   └─ec2-fullstacks
   │       ├─main.tf
   │       └─variables.tf
   └─qa
       └─testappapi
           ├─testappapi_backend.tfvars
           ├─main.tf
           └─terraform.tfvars

模块下:

c:\terraform\modules\ec2-fullstacks\main.tf的内容:

provider "aws" {
}

terraform {
  backend "s3" {
    encrypt = true
  }
}

data "aws_ami" "ami" {
  most_recent = true
  filter {
    name   = "name"
    values = ["${var.ec2_ami_name}*"]
  }
}

output "ami_id" {
  value = "${data.aws_ami.ami.id}"
}

c:\terraform\modules\ec2-fullstacks\variables.tf 内容:

variable "ec2_ami_name"  {}
variable "aws_account_name" {}
variable "aws_region" {}

项目下(testappapi):

C:\terraform\qa\testappapi\main.tf的内容:

provider "aws" {
}

terraform {
  backend "s3" {
    encrypt = true
  }
}

module "testappapiqa" {
  source = "C:/terraform/modules/ec2-fullstacks"
}

C:\terraform\qa\testappapi\terraform.tfvars的内容:

aws_account_name = "QA"
aws_region = "us-east-1"
ec2_ami_name = "WinAMI-2016-01-IIS"

C:\terraform\qa\testappapi\testappapi_backend.tfvars的内容:

profile = "qa"
region = "us-east-1"
bucket = "tfstate-123456789012"
key = "qa/testappapi.tfstate"
dynamodb_table = "tfstate"

这是我尝试初始化时发生的情况:

C:\terraform\qa\testappapi>terraform get
- module.testappapi
  Getting source "C:/terraform/modules/ec2-fullstacks"

C:\terraform\qa\testappapi>terraform init -backend-config=testappapi_backend.tfvars
Initializing modules...
- module.testappapi

Initializing the backend...
Error: module "testappapi": missing required argument "ec2_ami_name"
Error: module "testappapi": missing required argument "aws_account_name"
Error: module "testappapi": missing required argument "aws_region"

C:\terraform\qa\testappapi>

我原以为项目文件夹 (testappapi) 下 main.tf 中的 source 会从同一项目文件夹下的 terraform.tfvars 文件中获取值,但事实并非如此。

我在这里缺少什么?

【问题讨论】:

    标签: variables module terraform terraform-provider-aws


    【解决方案1】:

    您在c:\terraform\modules\ec2-fullstacks\main.tf 中创建了一个模块,其中包含以下强制变量

    variable "ec2_ami_name"  {}
    variable "aws_account_name" {}
    variable "aws_region" {}
    

    因此,在引用此模块时,terraform 也希望您传递这些强制性参数。你可以在C:\terraform\qa\testappapi\main.tf这样使用它

    module "testappapiqa" {
      source = "C:/terraform/modules/ec2-fullstacks"
      ec2_ami_name = "${var.ec2_ami_name}"
      aws_account_name = "${var.aws_account_name}"
      aws_region = "${var.aws_region}"
    }
    

    现在主文件引用ec2_ami_name, aws_account_name, aws_region 变量,这些变量未在testappapi 文件夹中定义。所以你可以在C:\terraform\qa\testappapi\variables.tf中定义这些变量

    variable "ec2_ami_name"  {}
    variable "aws_account_name" {}
    variable "aws_region" {}
    

    现在应该可以了。

    【讨论】:

    • 感谢您的回答。其实我知道的就这么多了。当我将 variables.tf 文件从模块文件夹复制到项目文件夹并使用“${var.}”调用所有数据时,我不会认为这是完全可重用的 terraform 代码。
    猜你喜欢
    • 2019-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-07
    • 2021-04-14
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    相关资源
    最近更新 更多