【问题标题】:Is it possible to pass in variables for Terraform target modules via command line?是否可以通过命令行为 Terraform 目标模块传递变量?
【发布时间】:2019-09-13 01:02:20
【问题描述】:

我想运行以下命令。本质上是在定位模块时传递环境变量。

terraform plan -target module.network -var 'env=dev'

terraform apply -target module.network -var 'env=dev'

但是它抱怨变量没有在根模块中声明,即使它是在模块文件夹本身中声明的。 然后我尝试了不同的声明变量组合,但没有成功。

  1. 在 /main.tf 中声明变量
  2. 在 /terraform.tfvars 中设置变量

这是我的文件和文件夹结构。

/main.tf

# Network (VPC, Gateway, Subnets, Security Groups)
module "network" {
    source = "./modules/network"
}

/modules/network/vars.tf

variable "env" {
    default = "dev"
}

variable "region" {
    default = "us-east-1"
}

variable "subnet_cidr" {
    type = list(string)
    default = ["10.0.1.0/24","10.0.2.0/24","10.0.3.0/24"]
}

# Retrieve AZs Dynamically
data "aws_availability_zones" "azs" {}

/modules/network/main.tf

provider "aws" {
    profile    = "default"
    region     = var.aws_region
    version    = "2.26"
}

# Create VPC
resource "aws_vpc" "vpc" {
    cidr_block            = "10.0.0.0/16"
    enable_dns_hostnames  = true
    enable_dns_support    = true
    tags = {
        Name = "${var.env}-vpc"
    }
}

# Create Subnets Dynamically from list
resource "aws_subnet" "subnets" {
    count       = "${length(var.subnet_cidr)}"
    vpc_id      = "${aws_vpc.vpc.id}"
    cidr_block  = "${element(var.subnet_cidr,count.index)}"
    availability_zone = "${element(data.aws_availability_zones.azs.names,count.index)}"
    tags = {
        Name = "${var.env}-subnet-${count.index+1}"
    }
}

# Create internet gateway to give our VPC access to the outside world
resource "aws_internet_gateway" "default" {
    vpc_id = "${aws_vpc.vpc.id}"
    tags = {
        Name = "${var.env}-gateway"
    }
}

# Grant the VPC internet access on its main route table
resource "aws_route" "internet_access" {
    route_table_id         = "${aws_vpc.vpc.main_route_table_id}"
    destination_cidr_block = "0.0.0.0/0"
    gateway_id             = "${aws_internet_gateway.default.id}"
}

【问题讨论】:

    标签: terraform terraform-provider-aws


    【解决方案1】:

    搞定了。我能够将变量传递给网络模块。

    以前,我将根模块和网络模块视为同一范围。需要将来自根目录的变量传递到模块中。

    variable "env" {
        default = "dev"
    }
    
    variable "aws_region" {
        default = "us-east-1"
    }
    
    # Network (VPC, Gateway, Subnets)
    module "network" {
        source = "./modules/network"
        aws_region = var.aws_region
        env = var.env
    }
    

    然后运行这个命令。

    terraform plan -target module.network -var 'env=dev'
    

    【讨论】:

    • 请注意,除非在特殊情况下,否则您不应使用-target。有关详细信息,请参阅the documentation
    • 是的。我面临的特殊情况是 PostgreSQL 提供商没有能力在创建数据库和数据库用户之前等待 AWS 数据库被预置。该提供程序无法使用depends_on 属性。见:github.com/hashicorp/terraform/issues/2430
    猜你喜欢
    • 2021-06-15
    • 2012-11-02
    • 1970-01-01
    • 2013-06-26
    • 2022-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多