使用 TF 0.12+ 的条件资源从 output.tf 继承值
Inheriting Values from output.tf with conditional resources using TF 0.12+
我在 GCP 中有一个服务帐户模块用于填充 kubernetes 机密
这是我的模块
resource "google_service_account" "service_account" {
count = var.enabled ? 1 : 0
account_id = var.account_id
display_name = var.display_name
}
resource "google_project_iam_member" "service_account_roles" {
count = var.enabled ? length(var.roles) : 0
role = "roles/${element(var.roles, count.index)}"
member = "serviceAccount:${google_service_account.service_account[0].email}"
}
resource "google_service_account_key" "service_account_key" {
count = var.enabled ? 1 : 0
service_account_id = google_service_account.service_account[0].name
}
'output.tf'包含以下内容
output "private_decoded_key" {
value = base64decode(
element(
concat(
google_service_account_key.service_account_key.*.private_key,
[""],
),
0,
),
)
description = "The base 64 decoded version of the credentials"
}
由于有一个条件是 none 这些资源是在没有 enabled
标志的情况下创建的,我不得不在 TF 0.11.14 中以这种方式处理它,以及 tf0.12 自动升级工具这里没有做太多改变。
如何在 Terraform 0.12.24 中简化它,
我尝试将输出修改为简单
value = base64decode(google_service_account_key.service_account_key[0].private_key)
但问题是,如果相应的 kubernetes 集群在删除过程中被删除,并且由于 terraform 而在中途出现错误,我将无法使用以下方法清理其余资源的 terraform 状态
`地形破坏'
尝试将 count
转换为 for_each
如下所示,但出现以下错误
resource "google_service_account" "service_account" {
# count = var.enabled ? 1 : 0
for_each = var.enabled ? 1 : 0
account_id = var.account_id
display_name = var.display_name
}
resource "google_project_iam_member" "service_account_roles" {
# count = var.enabled ? length(var.roles) : 0
for_each = var.enabled ? toset(var.roles) : 0
# role = "roles/${element(var.roles, count.index)}"
role = "roles/${each.value}"
member = "serviceAccount:${google_service_account.service_account[0].email}"
}
for_each = var.enabled ? toset(var.roles) : 0
The true and false result expressions must have consistent types. The given
expressions are set of dynamic and number, respectively.
我上面哪里做错了?
在您提到的 terraform 版本 (0.12.24) 中,您应该可以在 outputs.tf
:
中使用 try()
value = try(base64decode(google_service_account_key.service_account_key[0].private_key), "")
如果 google_service_account_key.service_account_key[0].private_key
由于任何原因无法解析,这将默认为 ""
;当然你也可以默认为null
。
Edit/Update:回答问题的第二部分(已编辑):
为了消除双方需要具有相同类型的错误,您需要在转换为for_each
时使用[]
作为空集而不是0
:
for_each = var.enabled ? toset(var.roles) : []
请注意现有的基础设施,因为在从 count
转换为 for_each
时需要操作状态文件,否则 terraform 将尝试破坏和创建资源。
(我将在我目前正在撰写的关于如何编写 Terraform 模块的系列故事的第 3 部分中更详细地介绍这一点。您可以找到 part 1 on medium,第 2 部分将在下周发布。 )
我在 GCP 中有一个服务帐户模块用于填充 kubernetes 机密
这是我的模块
resource "google_service_account" "service_account" {
count = var.enabled ? 1 : 0
account_id = var.account_id
display_name = var.display_name
}
resource "google_project_iam_member" "service_account_roles" {
count = var.enabled ? length(var.roles) : 0
role = "roles/${element(var.roles, count.index)}"
member = "serviceAccount:${google_service_account.service_account[0].email}"
}
resource "google_service_account_key" "service_account_key" {
count = var.enabled ? 1 : 0
service_account_id = google_service_account.service_account[0].name
}
'output.tf'包含以下内容
output "private_decoded_key" {
value = base64decode(
element(
concat(
google_service_account_key.service_account_key.*.private_key,
[""],
),
0,
),
)
description = "The base 64 decoded version of the credentials"
}
由于有一个条件是 none 这些资源是在没有 enabled
标志的情况下创建的,我不得不在 TF 0.11.14 中以这种方式处理它,以及 tf0.12 自动升级工具这里没有做太多改变。
如何在 Terraform 0.12.24 中简化它, 我尝试将输出修改为简单
value = base64decode(google_service_account_key.service_account_key[0].private_key)
但问题是,如果相应的 kubernetes 集群在删除过程中被删除,并且由于 terraform 而在中途出现错误,我将无法使用以下方法清理其余资源的 terraform 状态 `地形破坏'
尝试将 count
转换为 for_each
如下所示,但出现以下错误
resource "google_service_account" "service_account" {
# count = var.enabled ? 1 : 0
for_each = var.enabled ? 1 : 0
account_id = var.account_id
display_name = var.display_name
}
resource "google_project_iam_member" "service_account_roles" {
# count = var.enabled ? length(var.roles) : 0
for_each = var.enabled ? toset(var.roles) : 0
# role = "roles/${element(var.roles, count.index)}"
role = "roles/${each.value}"
member = "serviceAccount:${google_service_account.service_account[0].email}"
}
for_each = var.enabled ? toset(var.roles) : 0
The true and false result expressions must have consistent types. The given
expressions are set of dynamic and number, respectively.
我上面哪里做错了?
在您提到的 terraform 版本 (0.12.24) 中,您应该可以在 outputs.tf
:
try()
value = try(base64decode(google_service_account_key.service_account_key[0].private_key), "")
如果 google_service_account_key.service_account_key[0].private_key
由于任何原因无法解析,这将默认为 ""
;当然你也可以默认为null
。
Edit/Update:回答问题的第二部分(已编辑):
为了消除双方需要具有相同类型的错误,您需要在转换为for_each
时使用[]
作为空集而不是0
:
for_each = var.enabled ? toset(var.roles) : []
请注意现有的基础设施,因为在从 count
转换为 for_each
时需要操作状态文件,否则 terraform 将尝试破坏和创建资源。
(我将在我目前正在撰写的关于如何编写 Terraform 模块的系列故事的第 3 部分中更详细地介绍这一点。您可以找到 part 1 on medium,第 2 部分将在下周发布。 )