我一直试图从我的 Terraform 代码中设置一组 helm 属性。更准确地说,我想通过 terraform 设置以下值
我的猜测是我需要做这样的事情:
set {
name = "env"
value = "{ATL_PROXY_NAME: jira.example.com,ATL_PROXY_PORT: 443,ATL_TOMCAT_SCHEME: https}"
}
但我收到以下错误:
invalid type for io.k8s.api.core.v1.EnvVar: got "string", expected "map"
谢谢!
env
的值类型应该是一个带有键(name
,value
)的对象数组,使用terraform我们可以定义数组元素并一一设置它们的值:
name
的值value
的值set {
name = "env[0].name"
value = "ATL_PROXY_NAME"
}
set {
name = "env[0].value"
value = "jira.example.com"
}
set {
name = "env[1].name"
value = "ATL_PROXY_PORT"
}
set {
name = "env[1].value"
value = "443"
}
set {
name = "env[2].name"
value = "ATL_TOMCAT_SCHEME"
}
set {
name = "env[2].value"
value = "https"
}
如果有人需要通过 helm-chart 中的 terrafrom 设置 env 或 ExtraEnv:
data "helm_template" "external_dns" {
name = "some-chart"
chart = "some-chart"
....
set {
name = "env[0].name"
value = "AWS_DEFAULT_REGION"
}
set {
name = "env[0].value"
value = "eu-central-1"
}
}
这会给你这个 yaml 清单:
env:
- name = AWS_DEFAULT_REGION
value = eu-central-1
通过 Helm 行为和 Kubernetes 清单语法交叉引用 helm_release 资源文档,我们期望在 Terraform 中使用
set
类型在资源中构造一个 map
块(正如 Kubernetes 错误消息所确认的那样)。
语法可以像下面这样固定:
set {
name = "env"
value = {"ATL_PROXY_NAME" = "jira.example.com", "ATL_PROXY_PORT" = 443, "ATL_TOMCAT_SCHEME" = "https"}
}
然后 Terraform
map
类型将按预期通过 Helm 输入作为 Kubernetes 清单中 env
键的值传递。