Helm模板中检查ip_range注解并追加或新增值的实现方法
问题背景
现有Helm Chart模板定义如下:
podAnnotations模板:
{{- define "deployAnnotations" -}} "key1" : "value1", "key2" : "value2" "ip_range": "20.20.20.20/32" {{- end -}}
- 在
deployment.yaml中引用该模板:
template: metadata: annotations: {{ include "podAnnotations" . | nindent 8 }}
- 额外定义
ipdeployAnnotations模板用于提供新的IP段:
{{- define "ipdeployAnnotations" -}} ip_range: 10.10.10.10/32 {{- end -}}
需求:检查podAnnotations中是否存在ip_range注解,若存在则将新IP段追加至原有值后;若不存在则新增该注解。用户尝试使用in运算符未成功,需可行实现方案。
推荐实现方案:基于字典的注解合并
直接操作字符串容易因格式变动出错,推荐将注解模板改为返回合法JSON结构,再通过Helm的字典处理函数实现合并逻辑,步骤如下:
1. 修正模板为JSON格式
首先将两个注解模板调整为返回合法JSON对象(注意语法修正,比如逗号、引号的正确使用):
修改podAnnotations模板
{{- define "podAnnotations" -}} { "key1": "value1", "key2": "value2", "ip_range": "20.20.20.20/32" } {{- end -}}
修改ipdeployAnnotations模板
{{- define "ipdeployAnnotations" -}} { "ip_range": "10.10.10.10/32" } {{- end -}}
2. 在Deployment中处理注解合并
在deployment.yaml中,通过fromJson将模板输出转为字典,再进行ip_range的检查与合并:
template: metadata: annotations: {{- # 将两个模板的JSON输出转为字典 -}} {{- $baseAnnotations := include "podAnnotations" . | fromJson -}} {{- $newIpAnnotation := include "ipdeployAnnotations" . | fromJson -}} {{- # 检查是否存在ip_range键 -}} {{- if hasKey $baseAnnotations "ip_range" -}} {{- # 追加新IP段到原有值 -}} {{- $_ := set $baseAnnotations "ip_range" (printf "%s,%s" $baseAnnotations.ip_range $newIpAnnotation.ip_range) -}} {{- else -}} {{- # 合并新注解到基础字典 -}} {{- $_ := merge $baseAnnotations $newIpAnnotation -}} {{- end -}} {{- # 将处理后的字典转回JSON并格式化输出 -}} {{- toJson $baseAnnotations | nindent 8 -}}
方案说明
fromJson:将模板输出的JSON字符串转为Helm可操作的字典对象hasKey:检查字典中是否存在指定键(替代不可靠的字符串in检查)set:修改字典中指定键的值,这里用printf拼接原有IP和新IPmerge:当不存在ip_range时,将新注解合并到基础字典中toJson:将处理后的字典转回JSON字符串,配合nindent实现格式对齐
备选方案:字符串直接处理(不推荐)
若无法修改原有模板结构,可通过字符串匹配替换实现,但这种方式依赖原模板的固定格式,维护性差:
template: metadata: annotations: {{- $baseStr := include "podAnnotations" . | trim -}} {{- # 提取新IP段的值 -}} {{- $newIp := include "ipdeployAnnotations" . | trim | replace "ip_range:" "" | trim | trimAll "\"" -}} {{- if (contains "\"ip_range\":" $baseStr) -}} {{- # 替换原有ip_range值为拼接后的内容 -}} {{- $baseStr | replace "\"ip_range\": \"20.20.20.20/32\"" (printf "\"ip_range\": \"20.20.20.20/32,%s\"" $newIp) | nindent 8 -}} {{- else -}} {{- # 新增ip_range注解 -}} {{- printf "%s,\n \"ip_range\": \"%s\"" ($baseStr | trimSuffix ",") $newIp | nindent 8 -}} {{- end -}}
内容的提问来源于stack exchange,提问作者SteveGr2015
相关产品推荐
相关产品推荐

