用一行命令过滤 kustomize build 命令的输出结果

定制化构建的输出往往是巨大的多文档YAML,每次都用less显示很麻烦。

我尝试写了一个使用jq和yq的单行过滤器,以kind和metadata.name作为筛选条件来处理多个YAML格式的文档。为什么要同时使用两者呢?因为似乎yq不支持select功能。参考资料:https://github.com/mikefarah/yq/issues/173。

$ kustomize build . | yq r - -d "*" -j | jq '.[] | select(.kind | match("service";"i")) | select(.metadata.name=="prometheus")' | jq . -s | yq r -
- apiVersion: v1
  kind: ServiceAccount
  metadata:
    name: prometheus
- apiVersion: v1
  kind: Service
  metadata:
    name: prometheus
  spec:
    ports:
    - port: 9090
      targetPort: 9090
    selector:
      app.kubernetes.io/name: prometheus
    type: ClusterIP

这个确实很长,所以我把它转换成了一个Shell脚本函数。

function kfilter() {
    cat - | yq r - -d "*" -j | \
        jq ".[] | select(.kind | match(\"$1\";\"i\")) | select(.metadata.name==\"$2\")" \
        | jq . -s | yq r -
}

结束了。

$ kustomize build . | kfilter service alertmanager
- apiVersion: v1
  kind: Service
  metadata:
    name: alertmanager
  spec:
    ports:
    - port: 9093
      targetPort: 9093
    selector:
      app.kubernetes.io/name: alertmanager
    type: ClusterIP

广告
将在 10 秒后关闭
bannerAds