В настоящее время YAML используется для настройки почти всего (для лучшего или хуже), поэтому ли разработан инженер, работающий с Kubernetes или Anisible, или разработчик, настраивая регистрацию в Python или CI/CD с действиями GitHub — вам приходится иметь дело с файлами YAML по крайней мере, от времени. Следовательно, возможность эффективного запроса и манипулировать YAML, является важным навыком для всех нас — инженеров. Лучший способ узнать, что это путем освоения инструмента обработки YAML, например варья
, что может сделать вас более эффективным во многих ваших ежедневных задачах, от простого поиска к сложным манипуляциям. Итак, давайте пройдемся и узнаем все это YQ
Должен предложить — в том числе пройденные, выбор, сортировка, уменьшение и многое другое!
Настройка
Прежде чем мы начнем использовать варья
Нам сначала нужно установить его. Когда ты гугл YQ
Хотя вы найдете два проекта/репозитории. Первый из них, в https://github.com/kislyuk/yq оболочка вокруг JQ
— процессор JSON. Если вы уже знакомы с jq.
Возможно, вы захотите схватить это и использовать синтаксис, который вы уже знаете. В этой статье мы будем использовать другой — немного популярный проект — от https://github.com/mikefarah/yq Отказ Эта версия не соответствует 100% соответствует JQ
Синтаксис, но его преимущество состоит в том, что это свободное зависимость (не зависит от JQ
), для более контекста от различий, см. Следующее Выпуск GitHub .
Чтобы установить его, отправляйтесь на документы И выберите метод установки, подходящий для вашей системы, просто убедитесь, что вы установите версию 4, так как это то, что мы будем работать здесь. Кроме того, вы можете настроить завершение оболочки, информацию о том, что доступно в https://mikefarah.gitbook.io/yq/commands/shell-completion Отказ
Теперь, когда мы его установили, нам также нужен файл yaml или документ для проверки команд, которые мы будем работать. Для этого мы будем использовать следующие файлы, которые имеют все общие вещи, которые вы можете найти в YAML — атрибуты (простое и вложенные), массивы и различные типы значений (строка, целые числа и логические значения):
# log.yaml timestamp: 1620197250 user: root log: level: fatal message: | Application exited with code 2 --- # user.yaml user: name: John surname: Smith gender: male active: true addresses: - street: "Oxford Street" city: London country: England - street: "Ludwigstrasse" city: Munich country: Germany orders: - 4356436 - 4345753 - 2345234
С этим с пути давайте узнаем основы!
Основы
Все команды, которые мы будем работать, начнутся с той же базы YQ Eval
следуют цитируемое выражение и ваш файл YAML. Одно исключение из этого было бы довольно печатать файлы yaml, в этом случае вы будете опускать выражение — например yq eval uvery.yaml
— В случае, если вы знакомы с jq.
тогда это эквивалентно кошка некоторые.json |. jq.
.
Необязательно, мы также можем включить некоторые дополнительные флаги, некоторые из более полезных будут -C
Чтобы заставить цветную вывод, -Я н
Чтобы установить отступ вывода на n
пробелы или -П
Для красивой печати.
Что касается основных выражений, есть много вещей, которые мы можем сделать, но наиболее распространенным проходит YAMLS, или другими словами — глядя под ключ в документе YAML. Это делается с использованием Отказ
(dot) оператор и в самых основных формах, это будет выглядеть так:
# yq eval '.user.addresses' user.yaml - street: "Oxford Street" city: London country: England - street: "Ludwigstrasse" city: Munich country: Germany
В дополнение к базовой навигации на навигации, вы часто хотите найти конкретный индекс в массиве (используя [N]
):
# yq eval ".user.addresses[1]" user.yaml street: "Ludwigstrasse" city: Munich country: Germany
И, наконец, вы также можете найти Splat Оператор полезен, который сплющает карты/массивы (обратите внимание на разницу с первым примером, на который мы смотрели):
# yq eval ".user.addresses[]" user.yaml street: "Oxford Street" city: London country: England street: "Ludwigstrasse" city: Munich country: Germany
Помимо базовых переездов, вы также можете ознакомиться с Выбор , что позволяет фильтруйте логическими выражениями. Для этого мы используем Выбрать(.)
. Здесь простой пример может быть фильтрация на основе ведущих цифр:
yq eval '.user.orders[] | select(. == "43*")' user.yaml 4356436 4345753
Этот пример также показывает использование трубы ( |
) — мы используем его, чтобы сначала перейти к части документа, который мы хотим фильтровать, а затем передавать его на Выбрать(...)
.
В приведенном выше примере мы использовали ==
Чтобы найти поля, которые равны шаблону, но вы также можете использовать Действительно =
соответствовать те, которые не равны. Кроме того, вы можете опустить Выберите
Функция в целом и вместо значений вы получите только логические результаты сопоставления:
yq eval '.user.orders[] | (. != "43*")' user.yaml false false true
Будь то совершенно новичок в варья
Или вы использовали его некоторое время, вы наверняка столкнетесь с проблемами, где вы не будете иметь представления, почему ваш запрос не вернет то, что вы хотите. В этих ситуациях вы можете использовать -В
Флаг, чтобы произвести многолетний вывод, который может дать вам информацию о том, почему запрос ведет себя так, как он делает.
Расширенное запрос
Ранее раздел показал основы, которые часто достаточно для быстрых поиска и фильтрации, но иногда вы можете использовать более продвинутые функции и операторы, например, при автоматизации определенных задач, которые включают в себя вход и/или вывод YAML. Итак, давайте рассмотрим еще несколько вещей, которые YQ
может предложить.
Иногда может быть полезно сортировать ключевые ключи в документе, например, если вы поддерживаете свои YAML в Git или только для общей читабельности. Это также удобно, если вам нужно разрабатывать 2 ямлевых файлов. Для этого мы можем использовать 'Победите (...)'
Функция:
# yq eval 'sortKeys(.user)' user.yaml user: active: true addresses: - street: "Oxford Street" city: London country: England - street: "Ludwigstrasse" city: Munich country: Germany gender: male name: John orders: - 4356436 - 4345753 - 2345234 surname: Smith
Если входной документ YAML является динамическим, и вы не уверены, какие ключи будут присутствовать, может иметь смысл сначала проверить свое присутствие с имеет («ключ»)
:
yq eval '.log | has("message")' log.yaml true yq eval '.log | has("code")' log.yaml false
Похож на случай с имеет («ключ»)
, вам может потребоваться сначала получить динамический список ключей, прежде чем делать определенные операции с документом, для этого вы можете использовать ключи
Функция:
yq eval '.log | keys' log.yaml - level - message
Проверка длины значения может быть необходима для входной фильтрации/проверки или убедиться, что значение не переполняет некоторые предопределенные границы. Это делается с использованием Длина
Функция:
yq eval '.log.message | length' log.yaml 31 yq eval '.user.addresses[0].street | length' user.yaml 13
Для задач автоматизации, которые имеют параметризованные входы, вы, безусловно, должны пройти переменные среды в YQ
Запросы. Вы можете, очевидно, использовать обычные переменные среды Shell, но вы окажетесь с очень сложными и трудно прочитать цитату сбежать. Поэтому может быть лучше использовать YQ
‘s env ()
Функция вместо этого:
level="warning" yq eval '.log.level == env(level)' log.yaml false level="fatal" yq eval '.log.level == env(level)' log.yaml true field="surname" yq eval '.user.[env(field)]' user.yaml Smith
Чтобы упростить обработку некоторых полей или массивов, вы также можете использовать некоторую строку, например Присоединяйтесь к
или Сплит
к объединению или разбивому тексту:
yq eval '.user.orders | join(", ")' user.yaml 4356436, 4345753, 2345234 yq eval '.log.message | split(" ")' log.yaml - Application - exited - with - code - 2
Последний и, вероятно, самый сложный пример для этого раздела — это преобразование данных, использующих Иррус
Отказ Чтобы привести причина использовать эту функцию, вам понадобится довольно сложный документ YAML, который не то, что я хочу сбрасывать здесь. Таким образом, вместо того, чтобы хотя бы дать вам представление о том, как работает функция, давайте использовать его для реализации «Бедный человек» Версия Присоединяйтесь к
Из предыдущего примера:
yq eval '.user.orders[] as $item ireduce (""; (. + " ") + $item)' user.yaml 4356436 4345753 2345234
Это не так, как самостоятельно, как предыдущие, так что давайте немного сломаемся. Первая половина ( .user.orders [] $ item ruduce
) запроса требует некоторого полета (последовательность) от yaml и назначает его переменной — в этом случае $ Предмет
Отказ Во второй части мы определяем начальное значение «»;
(пустая строка) и выражение, которое будет эвакуировано для каждого $ Предмет
— Вот это будет значение, которое было там ранее, присоединенным к пространству ( (. + "")
) с последующим предметом, который мы имеем итерацию ( + $ item
).
Манипулировать и модифицировать
В большинстве случаев вам понадобится только поиски, поиски, поиски и фильтрация существующих документов, но время от времени вам может потребоваться также манипулировать YAML и создавать новые из них. YQ
Предоставляет пару операторов для выполнения этих задач, поэтому давайте кратко пройдемся и посмотрите несколько примеров.
Самый простой — это оператор Союза, который действительно просто ,
(запятая). Это позволяет нам объединить результаты нескольких запросов. Это может быть полезно, если вам нужно извлечь несколько частей YAML одновременно, но не может сделать это с помощью одного запроса:
yq eval '.user, .log.level, .log.message' log.yaml root fatal Application exited with code 2
Другой довольно распространенный корпус использования будет добавлять записи в массив или объединение 2 массивов. Это делается с +
(плюс) Оператор:
# yq eval '.user.orders += 2845234' user.yaml ... orders: - 4356436 - 4345753 - 2345234 - 2845234
Еще один удобный оператор обновления ( =
), который ( сюрприз, сюрприз ) обновляет некоторое поле. Очень простой пример обновления уровня журнала в нашем образце ЯМЛ:
# yq eval '.log.level = "warning"' log.yaml timestamp: 1620197250 user: root log: level: warning message: | Application exited with code 2
Здесь важно указать, что по умолчанию результат отправляется на стандартный вывод, а не в исходный файл. Чтобы сделать обновление на месте, вам нужно будет использовать -Я
вариант.
Там еще несколько операторов, но не особенно полезны (большую часть времени), поэтому я не покажу вам кучу примеров, которые, вероятно, не помогут вам, вместо этого я дам вам несколько ссылок на документы, если вы хотите Чтобы узнать немного глубже:
Удобные примеры
Теперь, когда мы знаем теорию, давайте посмотрим на некоторые примеры и удобные команды, которые вы можете включить в ваш рабочий процесс прямо сейчас.
По понятным причинам мы начинаем с Kubernetes, поскольку это, вероятно, самый популярный проект, который использует YAML для конфигурации. Самый простой, но очень полезная вещь, что YQ
Может помочь нам с довольно печатными ресурсами Kubernetes или запросы определенных секций манифеста:
kubectl get pods some-pod -o yaml | yq eval '.spec' -
Другая вещь, которую мы можем сделать, это список имени ресурса и конкретный атрибут. Это может быть удобно для поиска или извлечения всех портов прослушивания услуг или, например, к поиску изображений PODS для каждого POD в пространстве имен:
kubectl get pods -o yaml | yq eval '{ .items[].metadata.name: .items[].spec.containers[0].image }' - first-pod: quay.io/repository/image:latest second-pod: icr.io/repository/image:latest third-pod: icr.io/repository/image:1.0.0
Обратите внимание, что выше, мы должны были использовать .Предметы []
потому что когда ты Получить
Все экземпляры ресурса, возвращенные Добрый это Список предметы
Отказ
В случае таких ресурсов, как стручки, развертывание или услуги, которые часто имеют много экземпляров в каждом пространстве имен, может быть нежелательно просто бросить их в консоль и просеять их вручную. Таким образом, вместо этого вы можете отфильтровать их на одном атрибуте, например, имя списка и порту прослушивания только сервисов, которые выставляются на конкретный порт:
kubectl get svc -o yaml | yq eval '.items[] | select(.spec.ports[].port == 8443) | { .metadata.name: .spec.ports[].targetPort }' - service-one: https service-two: 8080
Как все Кубернаны «Yaml инженеры» Знайте, иногда это может быть трудно запомнить все поля в некоторых конкретных ресурсах, так почему бы не только запросить все ключи, например, для развертывания spec.template.spec.
?
kubectl get deploy -o yaml | yq eval '.items[0].spec.template.spec | keys' - - containers - dnsPolicy - nodeSelector ...
Переезд из Куберанес, как насчет некоторых докер-состав
? Может быть, вам нужно временно удалить некоторые раздел, такие как Объемы
или HealthCheck
— Ну вот вы идете (это разрушительно, поэтому будьте осторожны):
yq eval -i 'del(.services.backend.healthcheck)' docker-compose.yml
Аналогичным образом, вы также можете удалить задачу от Ansible Playbook. Говоря о том — как насчет изменения Remote_User.
Во всех задачах в Anisible Playbook — здесь, давайте изменим его на корень
:
yq eval '.[].remote_user = "root"' playbook.yml
Закрытие мыслей
Я надеюсь, что это «Курс крах» поможет вам начать с использованием варья
, Но, как и в любом инструменте, вы научитесь использовать его только путем практики и фактически выполняя реальные мировые задачи, поэтому в следующий раз вам нужно будет найти что-то в файле YAML, не просто сбросить его в терминал, а скорее писать a YQ
Запрос, чтобы сделать работу для вас. Кроме того, если вы пытаетесь придумать запрос для вашей конкретной задачи, и поиск Google не включает ничего полезного, попробуйте поискать решение, использующее JQ
Вместо этого — синтаксис запроса практически одинаково, и вам может повезло искать JQ
Решения, учитывая, что это более популярный/общепринятый инструмент.
Оригинал: «https://dev.to/martinheinz/yq-mastering-yaml-processing-in-command-line-o0g»