我正在学习Terraform模块。
我已经为Google Provider创建了模块。
provider "google" {
credentials = "${var.credentials}"
project = "${var.project_id}"
region = "${var.region}"
zone = "${var.zone}"
}
我想从上面使用的模块中传递凭证文件路径。
这里是使用者模块。
main.tf
module "google" {
source = "../modules/google-provider"
project_id = "${var.project_id}"
credentials = "${var.credentials}"
}
variables.tf
variable "credentials" {
default = "${file("cred.json")}"
}
这是我得到的错误:
Error: variable "credentials": default may not contain interpolations
我阅读了这个stackoverflow comment,但不了解它如何工作。
谢谢您的帮助。
答案 0 :(得分:1)
从文档中
在配置的根模块中声明变量时, 您可以使用CLI选项和环境变量来设置它们的值。 在子模块中声明它们时,调用模块应通过 值在模块块中。
就您而言,
#This is your calling module, hence you need to pass variables to child module from here
module "google" {
source = "../modules/google-provider"
passed_project_id_to_child = "${var.project_id}"
passed_credentials_to_child = "${var.credentials}"
}
更新:由于某些原因,terraform不允许您使用插值语法读取文件,创建类型为 local_file docs
的数据源data "local_file" "credJSON" {
filename = "./cred.json"
}
那么您将需要在模块的配置文件中执行类似的操作,或者您也可以为此创建一个单独的文件
variable passed_project_id_to_child{
default = "${jsonencode(data.credJSON.content).projectId}"
}
variable passed_credentials_to_child{}
provider "google" {
credentials = "${var.passed_project_id_to_child}"
project = "${var.passed_project_id_to_child}"
region = "${var.region}"
zone = "${var.zone}"
}
希望这行得通。 了解更多here