kubernetes - yq 分割种类和唯一名称 : -s is not keeping unique kind and metadata. 名称

标签 kubernetes yaml yq

下面是我的testfile.yaml:

---
kind: Pod
metadata:
  name: amazing-application
---
kind: Deployment
metadata:
  name: amazing-deployment
---
kind: Service
metadata:
  name: amazing-deployment
---
kind: Service
metadata:
  name: tea-service

我的目标是将其分成 4 个文件,其中文件名是 .metadata.name,文件所在的目录是 .kind

我已经实现了我想要的:

for kind in $(yq e '.kind' testfile.yaml | awk '!/^(---)/' | uniq); 
do 
  mkdir "$kind"
  cd "$kind"
  yq 'select(.kind == "'$kind'")' ../testfile.yaml | yq -s '.metadata.name' 
  cd ..;
done

我想知道的是如何获得唯一的组合映射,或者以某种方式使用多个标准来分割测试文件而不是通过循环。

有没有办法使用yq-sselect来选择kind和metadata.name在该个体中是唯一的文档(文档以“---”分隔)?

因为如果您执行 yq -s '.kind' testfile.yaml ,它将生成三个 yaml 文件,而不是四个。与 yq -s '.metadata.name' testfile.yaml 相同;我们得到三个文件,因为并非所有名称都是唯一的 - 其中一个丢失了。

最佳答案

有几种方法可以直接在 yq 中执行此操作。

首先,您可以使用字符串与另一个属性连接来获得唯一的文件名:

yq -s '(.kind | downcase) + "_" + .metadata.name' testfile.yaml

这将创建如下文件:

deployment_amazing-deployment.yml
pod_amazing-application.yml
service_amazing-deployment.yml
service_tea-service.yml

或者您可以使用内置的 $index 来使文件名唯一:

yq -s '.metadata.name + "_" + $index'

这将创建:

amazing-application_0.yml
amazing-deployment_1.yml
amazing-deployment_2.yml
tea-service_3.yml

免责声明:我写了 yq

关于kubernetes - yq 分割种类和唯一名称 : -s is not keeping unique kind and metadata. 名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75888239/

相关文章:

yaml - 使用 yq v4.x 在 yaml 文件中插入多行一个属性

java - jQuery 调用 REST API 在 Docker/Kubernetes 中不起作用

google-app-engine - 在 Google AppEngine app.yaml 中上传有什么作用?

python - 如何使 Python Yaml 库以人性化的方式保存?

go - 使用结构解析 YAML

yaml - yq 将数据追加到 yaml 文件中

amazon-web-services - kubectl错误访问EKS集群时必须登录服务器(未授权)

apache-spark - 在 Kubernetes 上启用 Spark 的 DynamicAllocation?

Kubernetes client-go : watch. Interface vs. cache.NewInformer vs. cache.NewSharedIndexInformer?

yq 替换 list yaml 中的值