Как вставить или добавить поле в yaml после определенного ключа в yq

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

spec:
  replicas: 1
  strategy:
    type: Recreate

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

selector:
  matchLabels:
    app: test-app

Файл огромен и имеет много полей "spec:", поэтому его следует добавлять при первом совпадении.

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

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 ответа

Решение

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

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

Может стоит попробовать в родном yq?

Образец конвейера (непроверенный):

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

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

Ну вот

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

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

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

Другие вопросы по тегам