Вы можете работать разработчиком, администратором, облачным инженером или инженером DevOps, и независимо от вашей роли вы будете сталкиваться с YAML, и очень важно понимать, что и как устроено в yaml.
Эта статья подготовлена таким образом, чтобы вы могли ознакомиться с основами yaml.
Прежде чем приступить к основам YAML, позвольте мне кратко рассказать вам о сериализации данных.
Что такое сериализация данных?
Говоря простым языком, сериализация данных – это процесс преобразования данных в формат, который может храниться, передаваться по сети и интерпретироваться приложением.
Три наиболее распространенных формата сериализации данных – это XML, JSON и YAML.
Существуют и другие форматы, такие как BSON, MessagePack, Protobuf и т.д.
Это руководство посвящено только тому, что такое YAML и как работать с YAML, с практическими примерами.
Что такое YAML?
YAML, что расшифровывается как YAML ain’t markup language, – это язык сериализации данных, который является надмножеством JSON.
YAML так популярен благодаря своей простоте.
Создавать и читать файлы yaml проще, чем XML или json.
Современные инструменты, такие как ansible, docker, Kubernetes, Chef и т.д., и облачные среды, такие как Aws, Azure, GCP, используют yaml.
Вы увидите множество файлов конфигурации и развертывания, написанных с использованием yaml.
Например, в Ansible плейбук написан на yaml.
📜 Понимание основных компонентов Ansible – часть 1
Многие популярные языки программирования имеют библиотеки для работы с yaml, поэтому yaml можно легко интегрировать в любую среду.
Расширение YAML
Файлы YAML должны сохраняться с расширениями .yml или .yaml.
Все популярные текстовые редакторы, такие как Vscode, Atom, Vim, Sublime Text и т.д., имеют поддержку языка yaml.
Вы также можете установить такие расширения, как yaml linter, yaml to json/XML converter, yaml beautify и т.д. в ваши текстовые редакторы, которые предоставят больше возможностей при работе с yaml.
Базовая структура Yaml
Основной структурой yaml будет либо последовательность, либо тип словаря.
Тип последовательности похож на список python, а тип словаря похож на словари python.
Словари представляют собой пары ключ-значение, где ключ имеет строковый тип, а значение может быть любым скалярным типом.
Для разделения ключа и значения используется двоеточие (:).
Site_name: itsecforu
Каждый документ в потоке yaml должен быть разделен с помощью трех тире (—) и трех точек (…).
Три тире (—) указывают на начало документа, а три точки (…) – на конец документа в потоке.
В случае отсутствия нескольких документов нет необходимости использовать тире и точки.
--- operating_system: Redhat version: 8 Same_family: - Rocky Linux - Alma Linux - Fedora Linux ... --- operating_system: Debian version: 11 Same_family: - Ubuntu - Linux Mint - Pop!_OS ...
Yaml использует отступы для определения структуры объекта.
Табуляции не поддерживаются, и вы должны оставлять два пробела для отступов.
Когда вы нажимаете <tab> в текстовом редакторе при работе с yaml, он оставляет только два пробела, по крайней мере, так происходит в Vscode.
Подробнее об отступах вы узнаете в следующем разделе.
Я собираюсь запустить следующий фрагмент кода python, который разберет файл yaml и преобразует тип данных в тип данных python.
#!/usr/bin/python3 import yaml with open("input.yaml", 'r') as f: dict = yaml.load(f, yaml.FullLoader) for k, v in dict.items(): print (k + " : " + str(v)) print("data type", " = ", type(v)) print()
Вы можете использовать либо этот код, либо онлайн-интерпретатор для запуска и тестирования yaml-кодов, приведенных в этой статье.
Комментарии YAML
Комментарии дают лучшее понимание тому, кто читает yaml-файл.
Чтобы добавить комментарии в yaml-файл, используйте символ #.
Yaml не поддерживает многострочные комментарии.
Поэтому, если вы хотите добавить многострочные комментарии, вы должны префикснуть каждую строку символом #.
# CONFIGURATION FILE BASED ON PoP_!OS COSMIC DESKTOP OS_NAME: "Pop!_OS" VERSION: 21.04 # VERSION 21.10 REACHED EOL CODE_NAME: COSMIC
В приведенном выше примере добавлено два комментария.
Блочный комментарий добавлен в первой строке, а второй – это встроенный комментарий, добавленный в четвертой строке.
Тип строк YAML
Строки в yaml могут быть созданы как с кавычками, так и без кавычек.
Yaml достаточно умен, чтобы интерпретировать тип данных внутри.
Здесь ключ имеет строковый тип, и значение также задано строковым типом.
Важный момент, который следует запомнить.
- Создавайте строки без использования кавычек, если в этом нет необходимости.
- Используйте двойные кавычки, если строка содержит специальные символы.
- Используйте одинарные кавычки, если специальные символы должны интерпретироваться как литералы
User1_review: Pop_!os is great to work with User2_review: "Pop_!os \t is great to work with" User3_review: 'Pop_!os \t is great to work with'
Как я уже говорил ранее, yaml по умолчанию знает тип данных.
Существует также явный способ указать этот тип.
Используйте символ !!, за которым следует тип данных и строковое значение.
User1_review: !!str Pop_!os is great to work with
User4_review: > Among all the distribution I used PoP_!OS looks great
User5_review: | Among all the distribution I used PoP_!OS looks great
Вы можете использовать символ “-” после > или |, чтобы убрать пробелы.
User4_review: >- Among all the distribution I used PoP_!OS looks great. User5_review: |- Among all the distribution I used PoP_!OS looks great.
Если вы хотите сохранить “белое” пространство, вы можете добавить символ “+” после символов | или >.
User4_review: >+ Among all the distribution I used PoP_!OS looks great. User5_review: |+ Among all the distribution I used PoP_!OS looks great.
Числовой тип YAML
Yaml поддерживает числовые типы Integer, Float, Decimal или Hexadecimal.
По умолчанию парсер yaml определяет тип данных, но есть и явный способ определения типов данных int и float, как показано в примере ниже.
int1: 98765 int2: !!int 56789 # Explicit Integer definition float1: 20.0481 float2: !!float 20.0482 # Explicit Float definition
Шестнадцатеричные и восьмеричные значения будут преобразованы интерпретатором в десятичные.
hex1: 0x14d3 oct1: 014442
YAML булеан
Yaml поддерживает булевы значения “True” и “False”.
Вы также можете использовать “Yes” или “on”, что указывает на “True”, и “no” или “off”, что указывает на “false”.
Вы также можете явно определить тип данных, используя !!bool.
Для булевых значений не существует ограничений по регистру.
В приведенном ниже примере видно, что во многих случаях написано “True”, и синтаксический анализатор интерпретирует все как значение “True”.
upgrade: True Reboot_After_Upgrade: TRUE Enable_Firewall: on Set_Power_Profile: yes
Аналогичное условие применимо и к значению “False”.
upgrade: False Reboot_After_Upgrade: FALSE Enable_Firewall: off Set_Power_Profile: no
YAML Null
Чтобы сделать значение нулевым, можно использовать символ “~” или ключевое слово “null”.
Вы также можете определить ключ и оставить значение пустым, которое будет рассматриваться как null.
Вы также можете сделать явные определения, используя !!null.
Как и для boolean, для ключевого слова “null” не существует ограничений по регистру.
В приведенном ниже примере ключевое слово null записано в трех разных случаях.
upgrade: !!null null Reboot_After_Upgrade: NULL Enable_Firewall: Null Set_Power_Profile: ~ Set_Network_Interface: # NO VALUES PASSED
В python значение NULL интерпретируется как тип “None”, и если вы попытаетесь преобразовать yaml в json, нулевые значения будут интерпретироваться только как нулевое значение.
YAML Последовательность
Последовательность Yaml – это список значений, хранящихся по порядку.
Это как списки в python или массивы в Perl, где вы определяете переменную и храните одно или несколько значений.
Существует несколько способов определения последовательности в yaml.
Первый – это стиль in-flow, когда вы задаете имя ключа, за которым следует список значений в квадратных скобках.
Это похоже на список в python.
# INFLOW STYLE SEQUENCE app_to_be_updated: [ "firefox", "timeshift"]
Второй способ – создание последовательности с помощью блочного стиля.
Каждый элемент в последовательности будет иметь префикс тире, за которым следует пробел и значение элемента.
Каждый элемент должен быть написан в отдельной строке.
Вы можете либо сделать отступ в два пробела, либо создать последовательность без отступа.
Но в качестве лучшей практики придерживайтесь отступа.
# BLOCK STYLE SEQUENCE app_to_be_installed: - vscode - virtualbox - tilix app_to_be_removed: - pycharm - stacer - ufw
Также можно создать вложенную последовательность, как показано ниже.
# NESTED SEQUENCE applications: - Productivity: - vscode - vagrant - docker - python3 - Browser: - firefox - chrome - brave
Тип словаря YAML
Мы уже встречались с типами словарей в начальных разделах этой статьи.
Словарь – это пара ключ-значение, которая является одним из основных строительных блоков в yaml.
Ключи словаря всегда строкового типа, а значения могут быть любого скалярного типа.
Подобно последовательности, словарь также может быть записан несколькими способами.
Первый – это стиль Inflow, который похож на представление словарей python.
application: { Install: "Vscode", Remove: Stacer, Update: Firefox}
Словари также могут быть созданы с использованием блочного стиля.
application1: Install: Vscode Remove: Stacer Update: Firefox
Вы также можете создать список вложенных словарей.
application2: Install: python: 3.9 Vscode: 1.58.2 Remove: - Stacer - pycharm Update: Firefox
Анкоры и алиасы YAML
Вы можете реализовать DRY (Don’t Repeat Yourself) в вашем yaml-файле с помощью анкоров и алиасов.
Анкор обозначается с помощью символа “&”, а алиас – с помощью символа “*”.
Анкор похож на переменную в программировании.
Вы определяете анкор с помощью символа &, за которым следует ключевое слово, а затем используете алиас (ключевое слово *) для расширения значения анкор.
Посмотрите на следующий пример. &x определяется как анкор, а затем расширяется с помощью алиаса *x.
User4_review: &x Among all the distribution I used PoP_!OS looks great. User5_review: *x User6_review: *x
При использовании анкоров и алиасов можно переопределять конкретные значения с помощью символа <<.
Здесь я переопределяю значение версии с 21.10 на 21.04.
PoP_OS: &pos version: 21.10 code_name: cosmic desktop d_flavour: gnome rewrite: <<: *pos version: 21.04
Заключение
В этой статье мы рассмотрели, что такое yaml и как работать с различными типами yaml.
В этом руководстве я использовал Python в качестве парсера yaml.
Надеюсь, вы найдете это руководство по YAML полезным.
Если вы новичок в yaml, то я рекомендую попрактиковаться во всем, что мы показали в этой статье, что поможет вам освоиться с yaml и вы сможете начать использовать его в соответствии с вашим окружением.
см. также: