Как обрабатывать неподдерживаемый атрибут в Terraform
У меня есть код терраформа, как указано ниже
locals {
file_path = format("%s-%s", var.test1, var.test2)
test_decode = yamldecode((data.github_repository_file.test.content))
}
data "github_repository_file" "test" {
repository = "test-repo"
branch = "develop"
file = "${local.file_path}/local/test.yaml"
}
test_encode = ${yamlencode(local.test_decode.spec.names)}
Это работает нормально, когда атрибут « .spec.names » присутствует в файле test.yaml. Поскольку мы выбираем test.yaml на основе local.file_path, иногда атрибут .spec.names может отсутствовать в test.yaml, и план терпит неудачу с ошибкой: «Неподдерживаемый атрибут» . Как проверить наличие атрибута « .spec.names » в test.yaml?
Обновление вопроса для добавления примера yaml
Yaml с атрибутом имен
apiVersion: helm.toolkit.gitops.io/v2beta1
kind: HelmRelease
metadata:
name: "test"
namespace: "test-system"
spec:
chart:
spec:
chart: "test-environment"
version: "0.1.10"
names:
key1: "value1"
key2: "value2"
key3: "value3"
key4: "value4"
YAML без атрибута имен
apiVersion: helm.toolkit.gitops.io/v2beta1
kind: HelmRelease
metadata:
name: "test"
namespace: "test-system"
spec:
chart:
spec:
chart: "test-environment"
version: "0.1.10"
2 ответа
Вы можете использовать попытку :
test_encode = yamlencode(try(local.test_decode.spec.names, "some_default_value"))
Я не знаю, существует ли более элегантный способ, но вы можете проверить, существует ли такое свойство:
contains([for k, v in local.test_decode : k], "spec")
объединение этого, чтобы проверить, существуют ли спецификация и имена, как это, не сработало для меня, поскольку второе условие все еще оценивалось, даже если первое условие не удалось:
contains([for k, v in local.test_decode : k], "spec") && contains([for k, v in local.test_decode.spec : k], "names")
это помогает, но мне это не нравится, потому что я считаю это довольно хакерским:
contains([for k, v in local.test_decode : k], "spec") ? contains([for k, v in local.test_decode.spec : k], "names") : false