如何用yq处理YAML标签并注入到Kustomization模板嵌套位置?
实现JSON数组到Istio discoverySelectors YAML格式的转换与注入
1. 用yq直接生成目标YAML片段
不用先读取JSON数组再二次处理,直接通过yq遍历数组内的标签对象,生成符合要求的matchLabels条目:
# 生成MATCH_LABELS_BLOCK变量,包含所有discoverySelectors条目 MATCH_LABELS_BLOCK=$(yq -r '.cluster.config.istio_ns_scoping_labels[] | " - matchLabels:\n " + (keys[] + ": " + .[keys[]])' "$config_file")
命令解释
.cluster.config.istio_ns_scoping_labels[]:遍历数组中的每一个标签对象" - matchLabels:\n ":生成固定缩进和条目开头(缩进需和模板层级匹配)(keys[] + ": " + .[keys[]]):提取每个对象的键值对,拼接成标准YAML标签格式
执行后,MATCH_LABELS_BLOCK的内容就是你需要的片段:
- matchLabels: istio-discovery: enabled - matchLabels: kubernetes.io/metadata.name: keycloak-idc-identity-broker - matchLabels: kubernetes.io/metadata.name: keycloak-idc-identity-broker-2 - matchLabels: kubernetes.io/metadata.name: keycloak-idc-identity-broker-3
2. 调整模板文件
将原模板的discoverySelectors部分修改为(保证层级缩进正确):
meshConfig: accessLogFile: /dev/stdout discoverySelectors: ${MATCH_LABELS_BLOCK}
3. 用envsubst完成变量注入
执行以下命令,把生成的YAML片段替换到模板中,输出最终配置文件:
# 假设模板文件名为kustomization-template.yaml,输出到kustomization.yaml envsubst < kustomization-template.yaml > kustomization.yaml
补充说明
- 若使用yq v4+版本,上述命令完全兼容;旧版本可能需要微调语法,但v4是当前主流版本
- 原JSON输出中的注释行(
#istio_ns_scoping_labels)会被yq自动忽略,不影响处理
内容的提问来源于stack exchange,提问作者Hemant Kumar
相关产品推荐
相关产品推荐

