【问题标题】:I need my module to return either a list of items if input is a non-empty list or an empty list如果输入是非空列表或空列表,我需要我的模块返回项目列表
【发布时间】:2018-02-09 21:27:25
【问题描述】:

我的模块将possibly-empty-list 作为输入,如果该列表非空,则创建一些资源并返回我在模块外部需要的特定属性,如下所示:

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 返回一个空列表。

有什么想法吗?

编辑:

我尝试对输出执行三元检查,但由于某种原因,不支持使用列表,所以这不起作用,但我希望它说明了我正在尝试做的事情:

"${length(var.contexts) > 0 ? pagerduty_service_integration.*.integration_keys : list()}"

解决方案:

output "instance_id" { 
  value = "${element(concat(aws_instance.example.*.id, list("")), 0)}"
}

【问题讨论】:

  • 列表名称是什么? var.contexts?
  • 是的,这就是创建它所需要的,但它是一个可变长度列表。我将它添加到脚本的最顶部(之前它在不同的文件中)
  • 如果传入一个空列表,那么pagerduty_service_integrationcount将是0,不会创建资源。然后你得到你得到的错误,因为integration_keys 找不到不存在的pagerduty_service_integration
  • variable empty_list{ type = "list"} output "integration_keys" {value = "${coalescelist(join("", pagerduty_service_integration.*.integration_keys), var.empty_list)}"} 试试这个。更多信息在这里67bricks.com/blog/?p=85
  • 在此处的最底部:terraform.io/upgrade-guides/0-11.html 是我用于计算模块中的资源及其输出的内容 EX:output "instance_id" { value = "${element(concat(aws_instance.example.*.id, list("")), 0)}" }

标签: terraform string-interpolation pagerduty


【解决方案1】:

在 terraform 升级到 0.11 指南的最底部有一个部分:https://www.terraform.io/upgrade-guides/0-11.html,它显示了我用于计数资源的内容

例如: output "instance_id" { value = "${element(concat(aws_instance.example.*.id, list("")), 0)}" }

(从评论移过来)

【讨论】:

  • 谢谢,我也想接受你之前的评论,但只能投赞成票:)
猜你喜欢
  • 2019-01-06
  • 1970-01-01
  • 1970-01-01
  • 2014-04-17
  • 2012-11-08
  • 1970-01-01
  • 2015-01-27
  • 1970-01-01
  • 2017-04-01
相关资源
最近更新 更多