kubernetes yq拆分种类和唯一名称:-s未保留唯一种类和metadata.name

kd3sttzy  于 2023-04-11  发布在  Kubernetes
关注(0)|答案(2)|浏览(128)

下面是我的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

我想知道的是如何获得一个唯一的togetherMap,或者使用多个条件来分割测试文件,而不是通过循环。
有没有一种方法可以使用yq-sselect来选择kind和metadata.name在单个文档中的唯一位置(文档以'---'分隔)?
因为如果执行yq -s '.kind' testfile.yaml,它将生成三个yaml文件,而不是四个。我们得到三个文件,因为不是所有的name都是唯一的-一个丢失。

ijnw1ujt

ijnw1ujt1#

有几种方法可以直接在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

bfrts1fy

bfrts1fy2#

根据shell脚本的解决方法,您希望将每个文档存储到以.kind命名的子目录中以.metadata.name命名的文件中。但是,yq的拆分选项-s无法创建子目录,并且在提供-s '.kind + "/" + .metadata.name'等命名方案时会失败。
备选方案:

  • 你可以尝试提交一个feature request。作者对适应新的用例持开放态度。事实上,-s选项本身也是this way
  • 你可以(暂时)将上面的/字符替换为其他字符(有效,但不包含在其他名称中),然后使用shell脚本迭代文件,将它们移动并重命名到正确的位置(总共只需要调用一次yq)。使用_的示例:
yq -s '.kind + "_" + .metadata.name' . testfile.yaml && for f in *_*
do mkdir -p "${f%%_*}" && mv "$f" "${f%%_*}/${f#*_}"; done
  • 根据您对文件/文档的总体目标,您可以考虑使用原始文件的副本,每个副本都减少为“属于一起”的文档,即用文件替换子目录,并在这些文件中保存一组分组的文档。(或eacommand[.]组合以生成文档阵列,然后group_by.kind上将共享给定标准的那些文档收集到子阵列中,最后.[] | split_doc将这些组再次转换为文档,以便被-s.
yq ea -s '.[0].kind' '[.] | group_by(.kind) | .[] | split_doc' testfile.yaml

捕获。注意,从技术上讲,输出仍然只是(以前的)文档的数组,而不是“真实的的”多文档文件,它们需要另一个.[] | split_doc应用于它们中的每一个,以便正确地重新转换它们(这里不包括)。

相关问题