【问题标题】:Accessing Terraform variables outside the module在模块外访问 Terraform 变量
【发布时间】:2019-09-25 15:15:08
【问题描述】:

我有一个 terraform 文件夹结构,如下所示。我正在访问从01_app 模块到02_tenant 模块的输出变量。但是输出变量不能跨模块访问。

我正在为这两个文件夹管理两个不同的状态文件。有人可以帮助我跨模块访问输出变量吗?

我在01_app/main_infra_app.tf中声明了一个输出变量:

output "key_vault_id" {
  value = "${azurerm_key_vault.key_vault.id}"
}

02_tenant/variables.tf:

variable "key_vault_id" {
}

我在02_tenant/main_infra_app.tf中添加了下面的块:

module "kv" {
  source = "./01_app"
  key_vault_value_name  =   "${01_app.key_vault_id}"
}

[编辑:01] 这是错误日志。

Terraform v0.12.9
2019-09-23T17:15:39.9624707Z [command]C:\hostedtoolcache\windows\terraform\0.12.9\x64\terraform.exe init --backend-config=d:\a\r1\a/_Infrastructure/terraform/02_tenant/var/backend.tfvars --reconfigure
2019-09-23T17:15:40.0555160Z ‌There are some problems with the configuration, described below.‌
2019-09-23T17:15:40.0555674Z 
2019-09-23T17:15:40.0556565Z The Terraform configuration must be valid before initialization so that
2019-09-23T17:15:40.0556859Z Terraform can determine which modules and providers need to be installed.‌
2019-09-23T17:15:40.0557069Z ‌
2019-09-23T17:15:40.0557287Z ‌Error: ‌Extra characters after interpolation expression‌
2019-09-23T17:15:40.0557482Z 
2019-09-23T17:15:40.0557678Z ‌  on main_infra_tenant.tf line 42, in module "x":‌
2019-09-23T17:15:40.0557881Z   42:   key_vault_value_name  =   "${01‌_app‌.key_vault_id}"‌
2019-09-23T17:15:40.0558082Z ‌
2019-09-23T17:15:40.0558277Z Expected a closing brace to end the interpolation expression, but found extra
2019-09-23T17:15:40.0558484Z characters.
2019-09-23T17:15:40.0558656Z ‌
2019-09-23T17:15:40.0696178Z ##[error]Terraform command 'init' failed with exit code '1'.:  Extra characters after interpolation expression

[编辑 2] 我在 02_tenant/main_infra_tenant.tf 中添加了以下块。由于我已经命名 KV 和 RG 约定,我现在可以在第二个 .tf 文件中获取 kv_id。

data "azurerm_key_vault" "kv" {
  name                = var.kv_name
  resource_group_name = var.rg_name
}

# Write to Azure KV 
resource "azurerm_key_vault_secret" "kv_secret_for_key" {
  name         =  var.key_name
  value        =  base64encode(random_string.generate_key.result)
  key_vault_id =  "${data.azurerm_key_vault.kv.id}"

}

【问题讨论】:

  • 这应该像描述的那样工作,所以我们需要更多信息来说明为什么它不是。请为您的问题创建一个 MCVE。
  • 您收到的错误信息是什么?
  • @MattSchuchard 我已经添加了错误日志。
  • 根据您的错误日志,它指向您的错误位置,您能否检查一下 main_infra_tenat.tf 第 42 行?如果你想直接使用这个值而不是作为插值函数,你可以尝试使用双转义(double $),然后检查问题是否仍然存在。

标签: azure-devops terraform azure-keyvault


【解决方案1】:

看起来您当前的代码正在使用来自01_app 模块的key_vault_id 输出作为输入来初始化模块本身。您应该在另一个基础架构中使用来自01_appkey_vault_id 输出。

尝试这样做,而不是在02_tenant 中使用01_app 的输出变量key_vault_id

02_tenant/main_infra_app.tf:

module "kv" {
  source                =   "./01_app"
  key_vault_value_name  =   "somevalue"
}

data "azurerm_key_vault_secret" "test" {
  name         = "key-vault-name"
  key_vault_id = "${module.kv.key_vault_id}"
}

所以现在您的代码在02_tenant 模块中使用01_app 的输出key_vault_id

【讨论】:

  • 感谢@Adil,我可以在下一个 .tf 文件中获取 kv.id
猜你喜欢
  • 1970-01-01
  • 2021-04-01
  • 2019-01-21
  • 2023-02-22
  • 2018-03-19
  • 1970-01-01
  • 1970-01-01
  • 2021-03-16
  • 2020-05-16
相关资源
最近更新 更多