如果输入是非空列表或空列表,我需要我的模块 return 项目列表
I need my module to return either a list of items if input is a non-empty list or an empty list
我的模块将 possibly-empty-list
作为输入,如果该列表非空,则创建一些资源和 return 我在模块外部需要的特定属性,如下所示:
variable contexts {
type = "list"
}
resource "pagerduty_service" "p1" {
count = "${length(var.contexts)}"
name = "p1-${element(var.contexts, count.index)}"
description = "p1-${element(var.contexts, count.index)}"
auto_resolve_timeout = 14400
acknowledgement_timeout = 1800
escalation_policy = "${pagerduty_escalation_policy.p1.id}"
alert_creation = "create_alerts_and_incidents"
incident_urgency_rule {
type = "constant"
urgency = "high"
}
}
data "pagerduty_vendor" "cloudwatch" {
name = "Cloudwatch"
}
resource "pagerduty_service_integration" "p1_cloudwatch" {
count = "${length(var.contexts)}"
name = "Amazon Cloudwatch"
vendor = "${data.pagerduty_vendor.cloudwatch.id}"
service = "${element(pagerduty_service.p1.*.id, count.index)}"
}
output "integration_keys" {
value = "${pagerduty_service_integration.*.integration_keys}"
}
我遇到的麻烦是,当此模块首先 运行 具有非空列表,从而创建资源时,它工作正常。如果我再次 运行 它,它会失败并出现以下异常:
* module.pagerduty.output.integration_keys: Resource 'pagerduty_service_integration.possibly_empty_resource_list' does not have attribute 'integration_key' for variable 'pagerduty_service_integration.possibly_empty_resource_list.*.integration_key'
如果 possibly_empty_resource_list
是空的,我想不出一个好的方法来让这个 output
return 成为一个空列表。
有什么想法吗?
编辑:
我尝试对输出执行三元检查,但出于某种原因,不支持使用列表,因此这行不通,但我希望它能说明我正在尝试做的事情:
"${length(var.contexts) > 0 ? pagerduty_service_integration.*.integration_keys : list()}"
解决方案:
output "instance_id" {
value = "${element(concat(aws_instance.example.*.id, list("")), 0)}"
}
在 terraform 升级到 0.11 指南的最底部有一个部分:https://www.terraform.io/upgrade-guides/0-11.html 显示了我使用的计数资源
例如:
output "instance_id" { value = "${element(concat(aws_instance.example.*.id, list("")), 0)}" }
(从评论中移过来)
我的模块将 possibly-empty-list
作为输入,如果该列表非空,则创建一些资源和 return 我在模块外部需要的特定属性,如下所示:
variable contexts {
type = "list"
}
resource "pagerduty_service" "p1" {
count = "${length(var.contexts)}"
name = "p1-${element(var.contexts, count.index)}"
description = "p1-${element(var.contexts, count.index)}"
auto_resolve_timeout = 14400
acknowledgement_timeout = 1800
escalation_policy = "${pagerduty_escalation_policy.p1.id}"
alert_creation = "create_alerts_and_incidents"
incident_urgency_rule {
type = "constant"
urgency = "high"
}
}
data "pagerduty_vendor" "cloudwatch" {
name = "Cloudwatch"
}
resource "pagerduty_service_integration" "p1_cloudwatch" {
count = "${length(var.contexts)}"
name = "Amazon Cloudwatch"
vendor = "${data.pagerduty_vendor.cloudwatch.id}"
service = "${element(pagerduty_service.p1.*.id, count.index)}"
}
output "integration_keys" {
value = "${pagerduty_service_integration.*.integration_keys}"
}
我遇到的麻烦是,当此模块首先 运行 具有非空列表,从而创建资源时,它工作正常。如果我再次 运行 它,它会失败并出现以下异常:
* module.pagerduty.output.integration_keys: Resource 'pagerduty_service_integration.possibly_empty_resource_list' does not have attribute 'integration_key' for variable 'pagerduty_service_integration.possibly_empty_resource_list.*.integration_key'
如果 possibly_empty_resource_list
是空的,我想不出一个好的方法来让这个 output
return 成为一个空列表。
有什么想法吗?
编辑:
我尝试对输出执行三元检查,但出于某种原因,不支持使用列表,因此这行不通,但我希望它能说明我正在尝试做的事情:
"${length(var.contexts) > 0 ? pagerduty_service_integration.*.integration_keys : list()}"
解决方案:
output "instance_id" {
value = "${element(concat(aws_instance.example.*.id, list("")), 0)}"
}
在 terraform 升级到 0.11 指南的最底部有一个部分:https://www.terraform.io/upgrade-guides/0-11.html 显示了我使用的计数资源
例如:
output "instance_id" { value = "${element(concat(aws_instance.example.*.id, list("")), 0)}" }
(从评论中移过来)