是否可以在terraform远程状态文件中访问模块状态?

时间:2016-09-27 17:00:43

标签: terraform

如果terraform脚本使用具有输出的模块,则可以使用-module命令的terraform output选项访问这些模块输出:

$ terraform output --help
Usage: terraform output [options] [NAME]

  Reads an output variable from a Terraform state file and prints
  the value.  If NAME is not specified, all outputs are printed.

Options:

  -state=path      Path to the state file to read. Defaults to
                   "terraform.tfstate".

  -no-color        If specified, output won't contain any color.

  -module=name     If specified, returns the outputs for a
                   specific module

  -json            If specified, machine readable output will be
                   printed in JSON format

如果我将该状态文件存储在S3或其他类似文件中,我可以使用terraform_remote_state数据提供程序引用主脚本的输出。

data "terraform_remote_state" "base_networking" {
  backend = "s3"
  config {
    bucket = "${var.remote_state_bucket}"
    region = "${var.remote_state_region}"
    key = "${var.networking_remote_state_key}"
  }
}

resource "aws_instance" "my_instance" {
  subnets = "${data.terraform_remote_state.base_networking.vpc_id}"
}

是否可以访问状态文件中存在的模块输出?我正在寻找像"${data.terraform_remote_state.base_networking.module.<module_name>.<output>}"或类似的东西。

2 个答案:

答案 0 :(得分:7)

是的,您可以从自己的模块访问远程状态输出。你只需要“传播”输出。

例如,假设您有类似的内容,您的base_networking基础架构,其中包含用于创建VPC的模块,并且您希望通过远程状态访问该VPC ID:

base_networking/
  main.tf
  outputs.tf
  vpc/
    main.tf
    outputs.tf

base_networking/main.tf中,您使用base_networking/vpc模块创建您的VPC:

module "vpc" {
  source = "./vpc"
  region = "${var.region}"
  name = "${var.vpc_name}"
  cidr = "${var.vpc_cidr}"
}

在模块的base_networking/vpc/outputs.tf中,您有一个id输出:

output "id" {
  value = "${aws_vpc.vpc.id}"
}

base_networking/outputs.tf中,您还有一个传播vpc_id的{​​{1}}输出:

module.vpc.id

现在,您可以使用以下内容访问output "vpc_id" { value = "${module.vpc.id}"

vpc_id

答案 1 :(得分:0)

我创建了一个 module,它允许您访问数据/资源值,而无需将输出一直传播到根模块之外。

module "get_state" {
    source = "Invicton-Labs/get-state/null
}

output "vpc_id" {
  value = module.get_state.resources["module.vpc.aws_vpc.vpc"].instances[0].attributes.id
}

它通过内部读取现有状态、解析它并将其组织成按地址索引的映射来实现这一点。