【问题标题】:How to ignore a value in list?如何忽略列表中的值?
【发布时间】:2020-09-22 23:14:56
【问题描述】:

我有一个字符串列表,我想忽略该列表中的某些元素。比如我的清单

variable domain_names = {
  type = list(string)
}

domain_names = ["foo.com","*.foo.com","*.foo2.com","bar.co.in"]

output = [ "foo.com","bar.co.in"]

我想忽略以 * 开头的任何内容并从中创建一个新列表。我怎样才能做到这一点?

我试图让这个模块更健壮地处理多个域名

locals {
  distinct_domain_name = distinct(var.domain_names)
}

resource "aws_acm_certificate" "main" {
  count                     = length(local.distinct_domain_name)
  domain_name               = local.distinct_domain_name[count.index]
  subject_alternative_names = [slice(var.domain_names, 1, length(var.domain_names))]
  validation_method         = var.validation_method
  tags {
    Name      = local.distinct_domain_name[count.index]
    owner     = "xxx"
    terraform = "true"
  }
}

【问题讨论】:

  • 这可能需要一个 lambda,所以我们可以看到代码的上下文吗?
  • 试试这个[for x in distinct(var.domain_names): x if not contains(distinct(var.domain_names), x)]

标签: terraform terraform-provider-aws terraform0.12+


【解决方案1】:

当我们的目标是过滤一个列表时,通常的起点是带有if 子句的for expression。这允许我们为每个元素做出决定,但提出了使用什么表达式来做出决定的问题。

对于“我们如何检测字符串是否具有特定前缀?”的问题。我认为至少有几种不同的方法可以做到这一点,但最简洁的方法可能是使用正则表达式,通过regexall,如果至少有一个匹配项,则返回 true:

length(regexall("^\\*\\.", domain_name)) > 0

我在这里使用regexall 而不是regex,因为regex 被定义为返回错误 如果没有匹配——它至少需要一个——而regexall 让我们自己处理零匹配情况。

将它与for 表达式结合起来会得到以下结果:

[ for domain_name in var.domain_names : domain_name if length(regexall("^\\*\\.", domain_name)) > 0 ]

上面生成了一个*.为前缀的列表。我们可以否定该表达式以产生相反的子集:

[ for domain_name in var.domain_names : domain_name if length(regexall("^\\*\\.", domain_name)) == 0 ]

【讨论】:

  • 如果您使用 terraform 0.13 并在尝试上述解决方案时遇到 Unsuitable value for left operand: number required.。您需要将length 函数添加到regexall 以计算带有条件的字符串的长度。
猜你喜欢
  • 2020-10-08
  • 2014-04-03
  • 1970-01-01
  • 2019-03-30
  • 1970-01-01
  • 2022-10-13
  • 2020-07-11
  • 2023-03-08
  • 2019-09-18
相关资源
最近更新 更多