52

我在.tf多个应用程序通用的文件中定义了资源。我通过.tfvars文件填充了许多字段。我需要完全基于.tfvars.

例如,如果我有这样的资源:

resource "cloudflare_record" "record" {
  zone_id = "${data.cloudflare_zones.domain.zones[0].id}"
  name    = "${var.subdomain}"
  value   = "${var.origin_server}"
  type    = "CNAME"
  ttl     = 1
  proxied = true
}

但后来我cloudflare = false在我的.tfvars文件中声明了类似的东西,我希望能够做这样的事情:

if var.cloudflare {
  resource "cloudflare_record" "record" {
    zone_id = "${data.cloudflare_zones.domain.zones[0].id}"
    name    = "${var.subdomain}"
    value   = "${var.origin_server}"
    type    = "CNAME"
    ttl     = 1
    proxied = true
 }
}

我查看了动态块,但看起来您只能使用它们来编辑资源中的字段和块。我需要能够忽略整个资源。

4

2 回答 2

76

使用声明的变量添加一个count带有三元条件的参数,.tfvars如下所示:

resource "cloudflare_record" "record" {
  count = var.cloudflare ? 1 : 0
  zone_id = "${data.cloudflare_zones.domain.zones[0].id}"
  name    = "${var.subdomain}"
  value   = "${var.origin_server}"
  type    = "CNAME"
  ttl     = 1
  proxied = true
}

在此示例中是在文件var.cloudflare中声明的布尔值。.tfvars如果为真,record则将创建计数 1。如果为假,record则将创建 0 计数。

应用之后count资源就变成了一个组,所以后面在引用0-index组的时候使用:

cloudflare_record.record[0].some_field
于 2020-02-14T18:23:27.517 回答
0

我遇到了基于变量创建 AWS 资源的类似问题。

要求:

  • 生产环境,使用进口证书;
  • 对于开发环境,请求 ACM 证书并通过 DNS 通过创建 Route53 记录对其进行验证。

我尝试如下代码。它在生产环境中抱怨 AWS 颁发的 aws_acm_certificate.alb[] 为空。我希望三元运算符“?:”快捷方式。

关于如何解决我的问题的任何建议?

谢谢,

老虎

# alb Cert
data "aws_acm_certificate" "vault-alb-imported" {
  counti = var.vault-cert-arn == "" ? 0 : 1 
  domain = "vault-alb.${var.domain}"
  types  = ["IMPORTED"]
}

resource "aws_acm_certificate" "alb" {
  count             = var.cert-arn == "" ? 1 : 0 
  domain_name       = "alb.${var.domain}"
  validation_method = "DNS"

  lifecycle {
    create_before_destroy = true
  }

  tags = merge(var.default-tags, tomap({
    Name = "alb"
  }))
}

resource "aws_route53_record" "alb-cert" {
  for_each = var.cert-arn == "" ? {} : { 
    for dvo in aws_acm_certificate.alb[0].domain_validation_options : dvo.domain_name => {
      name   = dvo.resource_record_name
      record = dvo.resource_record_value
      type   = dvo.resource_record_type
    }
  }
  allow_overwrite = true
  name            = each.value.name
  records         = [each.value.record]
  ttl             = 60
  type            = each.value.type
  zone_id         = var.public-hosted-zone-id
} 
于 2022-03-02T21:57:43.227 回答