helm 模板遍历 json 列表

helm template iterate over json list

我有一个输入文件,其内容如下:

snmpv3:      
  notificationTargetsConfiguration: '[{"manager_ip": "10.32.234.31", "username": "initial_snm1",
    "trap_dst_port": ""}, {"manager_ip": "10.32.234.42", "username": "initial_snm",
    "trap_dst_port": ""}, {"manager_ip": "10.32.232.24", "username": "initial_snm1",
    "trap_dst_port": ""}, {"manager_ip": "10.32.234.18", "username": "initial_snm",
    "trap_dst_port": ""}]'
  userConfiguration: '[{"auth_passwd": "U2FsdGVkX1+OhUYQwCqWgKE4TrGQCD5MoT1YrcCBqKU=",
    "auth_protocol": "MD5", "passphrase": "test", "priv_passwd": "U2FsdGVkX1+OhUYQwCqWgKE4TrGQCD5MoT1YrcCBqKU=",
    "priv_protocol": "DES", "sec_level": "authPriv", "username": "initial_snm"}, {"auth_passwd":
    "U2FsdGVkX1+OhUYQwCqWgKE4TrGQCD5MoT1YrcCBqKU=", "auth_protocol": "MD5", "passphrase":
    "test", "priv_passwd": "U2FsdGVkX1+OhUYQwCqWgKE4TrGQCD5MoT1YrcCBqKU=", "priv_protocol":
    "DES", "sec_level": "authPriv", "username": "initial_snm1"}]'
  myData: {"manager_ip": "10.32.234.42", "username": "initial_snm", "trap_dst_port": ""}

现在使用 {{- range $key, $value := $.Values.snmpv3.myData }} 我能够迭代,但是当在 userConfiguration 或 notificationTargetsConfiguration 上使用范围时,它只是不起作用。

由于myData只是一个json,我可以得到key和value,其他都是json列表。我无法遍历列表。

试过: {{- 范围 $myrow := $Values.snmpv3.notificationTargetsConfiguration }} {{- 范围 $key, $value := $myrow -}}

但这根本行不通。

Helm 无法解析 json 数组。

上面的myData可以正常运行,因为它符合yaml中结构的语法(一些键值对用大括号括起来)。

helm最多只能将json个对象解析成map。

示例:

snmpv3: 
  myData: '{"manager_ip": "10.32.234.42", "username": "initial_snm", "trap_dst_port": ""}'

!注意myData后面的数据用单引号括起来

Helm 可以将 json 字符串解析为映射和范围。

fromJson 将 JSON 文档解码为结构。如果输入不能被解码为 JSON 函数将 return 一个空字符串。如果 JSON 无效,mustFromJson 将 return 出错。

{{- range $k, $v :=  .Values.snmpv3.myData | fromJson }}
{{ $k }}: {{ $v | quote }}
{{- end }}

helm/Function
sprig/fromJson

我花了几个小时找出解决方案。最后,我得到了答案,但在此之前的挑战列表。

  1. JSON 数据在单引号内,这意味着对于解析器来说它是一个字符串,而不是 JSON 或字典。
  2. JSON数据是字典列表。

解决方案:

  1. 首先我们需要提取某个变量中的每个 JSON 列表项。
  2. 遍历应成为字典列表的变量。
  3. 从每个字典中提取数据。

因此最终代码将如下所示:

{{- $userConfig := (printf "{ userConfig: %s }" $.Values.snmpV3.userConfiguration) | fromYaml -}}

{{- range $uconfig := get $userConfig "userConfig" -}}
  userName: {{ $uconfig.username }}