Как вставить или добавить поле в 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.