Поиск по сайту:

Учебное пособие по 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, остается только два пробела или, по крайней мере, так происходит с Vscode.

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

Статьи по данной тематике