如何在terraform中使用locals来重复和合并块?(How to use locals in terraform to repeat and merge blocks?)
我有多个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}" } }但是文档没有提到如何使用locals来合并整个块,只有地图。
我尝试过以下方法:
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
I have multiple docker_container resources:
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}" } }And another one:
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}" } }I'm trying to use locals to re-use the common labels between both the containers. I have the following local defined:
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}" } }But the documentation doesn't mention how to use locals for merging entire blocks, only maps.
I've tried the following:
labels "${merge( local.traefik_common_labels, map( "traefik.frontend.rule", "Host:debug.in.bb8.fun", "traefik.port", 8080, "traefik.enable", "true", ) )}"which gives the following error:
tf11 plan
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 ('=')There is a pretty diff of my attempts at this 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", ))}" }You need to assign the value to labels like so
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", ))}" }
更多推荐
发布评论