4

我有一个带有以下块的 k8s yaml 文件

spec:
  replicas: 1
  strategy:
    type: Recreate

我想在“规范:”之后添加下面的块

selector:
  matchLabels:
    app: test-app

该文件很大并且有很多“spec:”字段,所以它应该在第一次匹配时添加。

最终文件内容应如下所示:

spec:
  selector:
    matchLabels:
      app: test-app
  replicas: 1
  strategy:
    type: Recreate

我使用带有正确缩进的 yq 提出了这个可行的解决方案,但它附加在文件的末尾,维护和读取类似的 100 个文件很痛苦。

yq  -i -y '.spec += {selector:{matchLabels:{app:"test-app"}}}' filename.yaml

欢迎使用 sed 或 awk 等工具提供任何答案。

4

3 回答 3

2

干得好

$ yq --yaml-output '.spec |= ({selector: {matchLabels: {app: "test-app"}}} + .)' </tmp/your-yaml-file.yaml 

spec:
  selector:
    matchLabels:
      app: test-app
  replicas: 1
  strategy:
    type: Recreate

既然你提到你有数百个文件,每个文件都有很多spec元素,目前还不清楚这是否能解决你的实际问题,但希望它能有所帮助。祝你好运!

于 2020-04-09T03:46:41.267 回答
1

我不熟悉yq,但我知道它支持有限的JSON I/O。这是结构性问题的解决方案jq

.spec |= ({selector: {matchLabels: {app: "test-app"}}} + .)

也许值得一试原生yq

示例管道(未经测试):

yq r -j k8s.yaml | jq "$script" | yq r --prettyPrint

不可救药的 Jeff Mercado也有这些 jq yamlifiers

于 2020-04-08T22:28:12.017 回答
1

您需要皮卡车解决方案。我建议改为使用地球移动器。
(注意:以下需要安装 Node.JS、Java-8 和命令行 Git)..

npm install -g commander@2.20.0
npm install -g @asux.org/cli-npm
export NODE_PATH=`npm root -g`
asux

以上是安装。


对于你想要的.. 创建一个/tmp/batch-file.txt包含以下行的。

## This is a comment.  No temporary files are created by this.
saveTo !ORIGINALINPUT
yaml read spec
saveTo !SAVED
useAsInput !ORIGINALINPUT
yaml delete 'spec/*'
yaml insert spec @/tmp/HugeSelectorFile.yaml
yaml insert spec !SAVED

运行命令:

asux yaml batch @/tmp/batch-file.txt -i ./YOURORIGINAL.yaml -o ./NEW.yaml

假设:
1)您的原始 YAML 文件是./YOURORIGINAL.yaml
2)您想要一个名为./NEW.yaml
3)您的“巨大选择器”文件被调用/tmp/HugeSelectorFile.yaml(参见上面的 batch.txt 中的倒数第二个石灰)

注意:文件名前缀的“@”字符是设计使然(因为没有“@”字符,这意味着您在命令内传递 JSON/YAML)。

更多可以在https://github.com/org-asux/org-ASUX.github.io/wiki/Welcome-to-WIKI-for-org.ASUX找到

于 2020-04-10T00:03:15.480 回答