syntax - 如何在 terraform 中使用本地人来重复和合并 block ?

标签 syntax terraform

我有多个 docker_container资源:

resource "docker_container" "headerdebug" {
  name  = "headerdebug"
  image = "${docker_image.headerdebug.latest}"

  labels {
    "traefik.frontend.rule" = "Host:debug.in.bb8.fun"
    "traefik.port" = 8080
    "traefik.enable" = "true"
    "traefik.frontend.passHostHeader" = "true"
    "traefik.frontend.headers.SSLTemporaryRedirect" = "true"
    "traefik.frontend.headers.STSSeconds" = "2592000"
    "traefik.frontend.headers.STSIncludeSubdomains" = "false"
    "traefik.frontend.headers.customResponseHeaders" = "${var.xpoweredby}"
    "traefik.frontend.headers.customFrameOptionsValue" = "${var.xfo_allow}"
  }
}

还有一个:

resource "docker_container" "cadvisor" {
  name  = "cadvisor"
  image = "${docker_image.cadvisor.latest}"

  labels {
    "traefik.frontend.rule" = "Host:cadvisor.bb8.fun"
    "traefik.port" = 8080
    "traefik.enable" = "true"
    "traefik.frontend.headers.SSLTemporaryRedirect" = "true"
    "traefik.frontend.headers.STSSeconds" = "2592000"
    "traefik.frontend.headers.STSIncludeSubdomains" = "false"
    "traefik.frontend.headers.contentTypeNosniff" = "true"
    "traefik.frontend.headers.browserXSSFilter" = "true"
    "traefik.frontend.headers.customFrameOptionsValue" = "${var.xfo_allow}"
    "traefik.frontend.headers.customResponseHeaders" = "${var.xpoweredby}"
  }
}

我正在尝试使用 locals重新使用两个容器之间的通用标签。我有以下本地定义:

locals {
  traefik_common_labels {
    "traefik.frontend.passHostHeader" = "true"
    "traefik.frontend.headers.SSLTemporaryRedirect" = "true"
    "traefik.frontend.headers.STSSeconds" = "2592000"
    "traefik.frontend.headers.STSIncludeSubdomains" = "false"
    "traefik.frontend.headers.customResponseHeaders" = "${var.xpoweredby}"
    "traefik.frontend.headers.customFrameOptionsValue" = "${var.xfo_allow}"
  }
}

但是the documentation没有提到如何使用 locals 来合并整个块,只有 map 。

我尝试了以下方法:

labels "${merge(
    local.traefik_common_labels,
    map(
      "traefik.frontend.rule", "Host:debug.in.bb8.fun",
      "traefik.port", 8080,
      "traefik.enable", "true",
    )
  )}"

这给出了以下错误:

TF11计划

Error: Failed to load root config module: Error loading modules: module docker: Error parsing .terraform/modules/2f3785083ce0d0ac2dd3346cf129e795/main.tf: key 'labels "${merge(
    local.traefik_common_labels,
    map(
      "traefik.frontend.rule", "Host:debug.in.bb8.fun",
      "traefik.port", 8080,
      "traefik.enable", "true",
    )
  )}"' expected start of object ('{') or assignment ('=')

我在这个 PR 上的尝试有很大的不同:https://git.captnemo.in/nemo/nebula/pulls/4/files

最佳答案

您需要将值分配给 labels像这样

locals {
  traefik_common_labels {
    "traefik.frontend.passHostHeader"                  = "true"
    "traefik.frontend.headers.SSLTemporaryRedirect"    = "true"
    "traefik.frontend.headers.STSSeconds"              = "2592000"
    "traefik.frontend.headers.STSIncludeSubdomains"    = "false"
    "traefik.frontend.headers.customResponseHeaders"   = "${var.xpoweredby}"
    "traefik.frontend.headers.customFrameOptionsValue" = "${var.xfo_allow}"
  }
}

resource "docker_container" "cadvisor" {
  name  = "cadvisor"
  image = "${docker_image.cadvisor.latest}"

  labels = "${merge(
    local.traefik_common_labels,
    map(
      "traefik.frontend.rule", "Host:debug.in.bb8.fun",
      "traefik.port", 8080,
      "traefik.enable", "true",
    ))}"
}

关于syntax - 如何在 terraform 中使用本地人来重复和合并 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47973324/

相关文章:

bash - $() 总是可以替换反引号以进行命令替换吗?

amazon-web-services - 自动为所有 AWS 账户创建相同的策略

amazon-web-services - 在已承担角色的 EC2 实例上运行 ecr 命令需要哪些 iam 策略?

azure - 如何使用环境变量配置通过系统分配的托管标识进行身份验证的多个 azurerm 提供程序

java - 在 AWS Lambda 中创建数据库服务

"short"的 C 数值常量后缀

ubuntu - Docker 镜像 Ubuntu 14.04 未连接互联网

c++ - C++ 中的外部枚举

ruby - 如何使用 'do' 关键字语法创建接受匿名函数的函数?

amazon-web-services - 使用 terraform 订阅 AmazonIpSpaceChanged 的​​ SNS 主题