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 }}
我花了几个小时找出解决方案。最后,我得到了答案,但在此之前的挑战列表。
- JSON 数据在单引号内,这意味着对于解析器来说它是一个字符串,而不是 JSON 或字典。
- JSON数据是字典列表。
解决方案:
- 首先我们需要提取某个变量中的每个 JSON 列表项。
- 遍历应成为字典列表的变量。
- 从每个字典中提取数据。
因此最终代码将如下所示:
{{- $userConfig := (printf "{ userConfig: %s }" $.Values.snmpV3.userConfiguration) | fromYaml -}}
{{- range $uconfig := get $userConfig "userConfig" -}}
userName: {{ $uconfig.username }}
我有一个输入文件,其内容如下:
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 }}
我花了几个小时找出解决方案。最后,我得到了答案,但在此之前的挑战列表。
- JSON 数据在单引号内,这意味着对于解析器来说它是一个字符串,而不是 JSON 或字典。
- JSON数据是字典列表。
解决方案:
- 首先我们需要提取某个变量中的每个 JSON 列表项。
- 遍历应成为字典列表的变量。
- 从每个字典中提取数据。
因此最终代码将如下所示:
{{- $userConfig := (printf "{ userConfig: %s }" $.Values.snmpV3.userConfiguration) | fromYaml -}}
{{- range $uconfig := get $userConfig "userConfig" -}}
userName: {{ $uconfig.username }}