helm模板对json列表进行迭代



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

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,所以我可以获得键和值,但其他都是json列表。我无法循环浏览列表。

已尝试:{{-range$myrow:=$Values.snmpv3.notificationTargetsConfiguration}}{{-range$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字符串解析为map和range。

fromJson将JSON文档解码为一个结构。如果无法将输入解码为JSON,则函数将返回一个空字符串。如果JSON无效,mustFromJson将返回一个错误

{{- 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 }}

最新更新