在模块外访问 Terraform 变量
Accessing Terraform variables outside the module
我有一个如下所示的 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[=13=].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}"
}
看起来您当前的代码正在使用 01_app
模块的 key_vault_id
输出作为输入来初始化模块本身。您应该在另一基础架构中使用 01_app
的 key_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
。
我有一个如下所示的 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[=13=].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}"
}
看起来您当前的代码正在使用 01_app
模块的 key_vault_id
输出作为输入来初始化模块本身。您应该在另一基础架构中使用 01_app
的 key_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
。