如果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>}"
或类似的东西。
答案 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
}
它通过内部读取现有状态、解析它并将其组织成按地址索引的映射来实现这一点。