如何将文件路径传递到模块?

时间:2019-08-08 19:33:45

标签: terraform

我正在学习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,但不了解它如何工作。

谢谢您的帮助。

1 个答案:

答案 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