Учебное пособие по YAML | Начало работы с YAML
Основы YAML
Вы можете работать разработчиком, администратором, облачным инженером или инженером DevOps, и независимо от вашей роли вы столкнетесь с YAML, и важно, чтобы вы понимали, что и как влияет на yaml. Эта статья написана таким образом, чтобы вы могли освоить основы yaml.
Прежде чем приступить к основам YAML, позвольте мне кратко рассказать вам о сериализации данных.
Что такое сериализация данных?
Проще говоря, сериализация данных — это процесс преобразования ваших данных в формат, который можно хранить, передавать по сети и интерпретировать приложением.
Тремя наиболее распространенными форматами сериализации данных являются XML, JSON и YAML. У нас также есть другие форматы, такие как BSON, MessagePack, Protobuf и т. д.
В этом руководстве основное внимание уделяется только тому, что такое YAML и тому, как работать с YAML, с практическими примерами.
Что такое ЯМЛ?
YAML (расшифровывается как YAML — это не язык разметки) — это язык сериализации данных, который является расширенным набором JSON. YAML настолько популярен из-за своей простоты. Файлы yaml легко создавать и читать по сравнению с XML или json.
Современные инструменты, такие как ansible, docker, Kubernetes, Chef и т. д., а также облачные среды, такие как Aws, Azure, GCP, используют yaml. Вы увидите множество файлов конфигурации и развертывания, написанных с использованием yaml. Например, в Ansible плейбук написан на языке yaml.
Многие популярные языки программирования имеют библиотеки для работы с yaml, поэтому yaml можно легко интегрировать с любой средой.
Расширение YAML
Файлы YAML следует сохранять с расширениями .yml
или .yaml
. Каждый популярный текстовый редактор, такой как Vscode, Atom, Vim, Sublime Text и т. д., поддерживает язык yaml.
Вы также можете установить расширения, такие как yaml linter, конвертер yaml в json/XML, yaml beautify и т. д., в свои текстовые редакторы, которые предоставят больше возможностей при работе с yaml.
Базовая структура Yaml
Базовая структура yaml будет либо последовательностью, либо словарным типом. Тип последовательности аналогичен списку Python, а тип словаря аналогичен словарям Python.
Словари представляют собой пары ключ-значение, где ключ имеет строковый тип, а значение может быть любого скалярного типа. Для разделения ключа и значения используйте двоеточие (:).
Site_name: ostechnix
Каждый документ в потоке 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 использует отступы для определения структуры объекта. Табуляция не поддерживается, поэтому для отступа следует оставить два пробела. Когда вы нажимаете
YAML-отступ
Подробнее об отступах вы узнаете в следующем разделе.
Я собираюсь запустить следующий фрагмент кода 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 достаточно умен, чтобы интерпретировать тип данных внутри себя. Здесь ключ имеет строковый тип, и значение также имеет строковый тип.
Важный момент, который следует запомнить.
- Создавайте строки без использования кавычек, если в этом нет необходимости.
- Используйте двойные кавычки, если строка содержит специальные escape-символы.
- Используйте одинарные кавычки, если специальные символы следует интерпретировать как литералы.
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
Как я говорил ранее, yaml по умолчанию знает тип данных. Существует также явный способ указания типа данных. Используйте символ !!
, за которым следует тип данных и строковое значение.
User1_review: !!str Pop_!os is great to work with
Неявное определение
Если у вас есть длинная строка, но вы хотите записать ее в несколько строк внутри файла yaml, вы можете сделать это, используя символ >
. Это называется сложенный стиль. Ваш синтаксический анализатор будет интерпретировать строку как одну строку, хотя вы записали ее в несколько строк.
User4_review: >
Among all the distribution
I used
PoP_!OS looks great
Многострочная строка в сложенном виде
Если многострочную строку необходимо напечатать как есть, используйте символ pipe (|
). Это называется буквальный стиль.
User5_review: |
Among all the distribution
I used
PoP_!OS looks great
Многострочная строка в буквальном стиле
Вы можете использовать модификаторы chomp для удаления или сохранения пробелов в конце значений. Вы можете использовать символ "-"
после >
или |
, чтобы удалить пробелы.
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
Типы данных Int и Float
Шестнадцатеричные и восьмеричные значения будут преобразованы интерпретатором в десятичные значения.
hex1: 0x14d3
oct1: 014442
Шестнадцатеричные и восьмеричные значения
YAML логический тип
Yaml поддерживает логические значения «True» и «False». Вы также можете использовать «Да» или «включено», что означает «Истина» и «нет». или «выключено», что указывает на «false». Вы также можете явно определить тип данных, используя !!bool.
Для логических значений нет ограничений по регистру. В приведенном ниже примере вы можете видеть, что во многих случаях я написал «True», и анализатор интерпретирует все как значение «True».
upgrade: True
Reboot_After_Upgrade: TRUE
Enable_Firewall: on
Set_Power_Profile: yes
Логическое истинное значение YAML
Аналогичное условие применимо и к значению «False».
upgrade: False
Reboot_After_Upgrade: FALSE
Enable_Firewall: off
Set_Power_Profile: no
Логическое ложное значение YAML
Внимание! Если вы попытаетесь заключить логическое значение в кавычки, оно будет воспринято как строка.
YAML Нулевой тип
Чтобы сделать значение нулевым, вы можете использовать символ «~
» или ключевое слово «null
». Вы также можете определить ключ и оставить значение пустым, которое будет считаться нулевым. Вы также можете дать явные определения, используя !!null
.
Как и в случае с логическим значением, для ключевого слова «null
» нет ограничений по регистру. В приведенном ниже примере вы можете видеть, что ключевое слово null записывается в трех разных случаях.
upgrade: !!null null
Reboot_After_Upgrade: NULL
Enable_Firewall: Null
Set_Power_Profile: ~
Set_Network_Interface: # NO VALUES PASSED
YAML Нулевой тип
В Python значение NULL интерпретируется как тип «Нет», и если вы попытаетесь преобразовать 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}
Словарь - Стиль притока
Словари также можно создавать с использованием стиля block.
application1:
Install: Vscode
Remove: Stacer
Update: Firefox
Словарь - Блочный стиль
Вы также можете создать список вложенных словарей.
application2:
Install:
python: 3.9
Vscode: 1.58.2
Remove:
- Stacer
- pycharm
Update: Firefox
Вложенный словарь
YAML-якоря и псевдонимы
Вы можете реализовать DRY (не повторяйте себя) в своем файле 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 и начать использовать его в соответствии со своей средой.
Связанное чтение:
- Как разобрать и красиво распечатать JSON с помощью инструментов командной строки Linux