将 terraform 变量值从项目文件夹中的 .tfvars 文件传递​​到模块

Raf*_*fiq 7 variables module terraform terraform-provider-aws

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

c:\terraform
   ??modules
   ?   ??ec2-fullstacks
   ?       ??main.tf
   ?       ??variables.tf
   ??qa
       ??testappapi
           ??testappapi_backend.tfvars
           ??main.tf
           ??terraform.tfvars
Run Code Online (Sandbox Code Playgroud)

在模块下:

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

c:\terraform
   ??modules
   ?   ??ec2-fullstacks
   ?       ??main.tf
   ?       ??variables.tf
   ??qa
       ??testappapi
           ??testappapi_backend.tfvars
           ??main.tf
           ??terraform.tfvars
Run Code Online (Sandbox Code Playgroud)

c:\terraform\modules\ec2-fullstacks\variables.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}"
}
Run Code Online (Sandbox Code Playgroud)

在项目(testappapi)下:

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

variable "ec2_ami_name"  {}
variable "aws_account_name" {}
variable "aws_region" {}
Run Code Online (Sandbox Code Playgroud)

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

provider "aws" {
}

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

module "testappapiqa" {
  source = "C:/terraform/modules/ec2-fullstacks"
}
Run Code Online (Sandbox Code Playgroud)

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

aws_account_name = "QA"
aws_region = "us-east-1"
ec2_ami_name = "WinAMI-2016-01-IIS"
Run Code Online (Sandbox Code Playgroud)

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

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>
Run Code Online (Sandbox Code Playgroud)

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

我在这里缺少什么?

小智 8

您已经c:\terraform\modules\ec2-fullstacks\main.tf使用以下强制变量创建了一个模块

variable "ec2_ami_name"  {}
variable "aws_account_name" {}
variable "aws_region" {}
Run Code Online (Sandbox Code Playgroud)

因此,在引用此模块时,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}"
}
Run Code Online (Sandbox Code Playgroud)

现在主文件正在引用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" {}
Run Code Online (Sandbox Code Playgroud)

现在这应该有效。

  • 谢谢您的回答。其实我知道的就这么多。当我将 variables.tf 文件从模块文件夹复制到项目文件夹并使用“${var.<varaible_name>}”调用所有数据时,我不会认为这是完全可重用的 terraform 代码。 (2认同)