Как вставить или добавить поле в yaml после указания ключа c в yq - PullRequest
1 голос
/ 08 апреля 2020

У меня есть файл yaml k8s с блоком ниже

spec:
  replicas: 1
  strategy:
    type: Recreate

, и я хочу добавить блок ниже после "spe c:"

selector:
  matchLabels:
    app: test-app

Файл огромен и имеет много полей «spe c:», поэтому его нужно добавить при первом совпадении.

Конечное содержимое файла должно выглядеть так:

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

Я придумал эту работу Решение с использованием yq с правильными отступами, но оно добавляется в конец файла. Его мучительно поддерживать и читать подобные файлы сотен.

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

Любые ответы с помощью таких инструментов, как sed или awk, приветствуются.

Ответы [ 3 ]

1 голос
/ 09 апреля 2020

Здесь вы go

$ 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, неясно, решит ли это вашу настоящую проблему, но, надеюсь, это может помочь , Удачи!

1 голос
/ 09 апреля 2020

Я не знаком с yq, но знаю, что он поддерживает ограниченный JSON I / O . Вот решение структурной проблемы с jq:

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

Возможно, стоит попробовать в нативном yq?

Пример конвейера (не проверено):

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

Есть также эти jam yamlifiers неисправимого Джеффа Меркадо.

0 голосов
/ 10 апреля 2020

Вы хотите решение пикапа. Вместо этого я предлагаю использовать Earth-mover.
(ВНИМАНИЕ: для следующих действий требуется 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 (см. 2-ую последнюю строчку в batch.txt выше)

ПРИМЕЧАНИЕ. Имена файлов с префиксом «@» являются собственными (как и без этого символа '@', это означает, что вы передаете JSON / YAML in-line в командной строке).

Больше можно найти в https://github.com/org-asux/org-ASUX.github.io/wiki/Welcome-to-WIKI-for-org.ASUX

...