如何从Helm Chart的Values中为ArgoCD ApplicationSet添加注解?
ArgoCD ApplicationSet 从Git目录内Values文件取值到注解的实现方法
问题需求
使用Git目录生成器的ArgoCD ApplicationSet模板,每个目录对应一个Helm Chart,希望从目录内的values.yaml中提取指定值(例如global.team),添加到生成的Application资源的注解中。
示例场景:
- 名为
annotations的目录下的values.yaml内容:
... global: team: dns
- 期望生成的Application注解:
metadata: name: 'development-annotations' annotations: itai-test: 'dns'
尝试过的无效方案
曾尝试用Merge Generator合并Git目录生成器与Git文件生成器,但未达到预期(无报错但注解未正确填充),配置如下:
spec: generators: - merge: mergeKeys: - path.basename generators: - git: repoURL: my-repo.git revision: HEAD directories: - path: '*' - git: repoURL: my-repo.git revision: HEAD files: - path: '{{path}}/values.yaml'
正确实现方法
直接在ApplicationSet模板中使用{{ .Values.global.team }}不可行,因为ApplicationSet模板不直接解析Helm的Values文件,必须通过生成器提取Values中的字段作为参数传入模板,具体步骤如下:
1. 配置Merge Generator,提取Values字段
修改Merge Generator配置,让文件生成器通过yqPath提取values.yaml中需要的字段,同时确保两个生成器的合并键完全匹配:
spec: generators: - merge: mergeKeys: - pathBasename # 统一用自定义键作为合并标识 generators: - git: repoURL: my-repo.git revision: HEAD directories: - path: '*' values: # 将目录名赋值给自定义键,用于合并 pathBasename: '{{path.basename}}' - git: repoURL: my-repo.git revision: HEAD files: # 匹配所有目录下的values.yaml - path: '*//values.yaml' values: # 从文件路径中提取目录名,作为合并键 pathBasename: '{{path.dirname | basename}}' # 用yqPath提取values.yaml中的global.team值 team: '{{yqPath ".global.team"}}'
2. 在模板中引用提取的字段
修改ApplicationSet模板,直接引用生成器传递过来的team字段:
template: metadata: name: 'development-{{path.basename}}' annotations: itai-test: '{{team}}'
注意事项
- 确保ArgoCD版本在2.4及以上,
yqPath功能需要该版本支持; - 合并键必须在两个生成器中都存在且值完全一致,否则无法正确合并;
- 如果
values.yaml中可能存在字段缺失的情况,可以添加默认值,例如{{yqPath ".global.team" | default "default-team"}}。
内容的提问来源于stack exchange,提问作者Itai Goldman
相关产品推荐
相关产品推荐

