📜 Самоучитель по YAML | Начало работы с YAML |

📜 Самоучитель по YAML | Начало работы с YAML

Мануал

Вы можете работать разработчиком, администратором, облачным инженером или инженером 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
Если у вас есть длинная строка, но вы хотите записать ее в несколько строк внутри вашего yaml-файла, вы можете сделать это с помощью символа >.
Это называется  folded style.
Ваш анализатор будет интерпретировать строку как одну строку, хотя вы написали ее в несколько строк.
User4_review: >
 Among all the distribution
 I used
 PoP_!OS looks great
Когда многострочная строка должна быть выведена как есть, используйте символ пайп (|). Это называется  literal style.
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

Шестнадцатеричные и восьмеричные значения будут преобразованы интерпретатором в десятичные.

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 и вы сможете начать использовать его в соответствии с вашим окружением.

см. также:

  1. 📜 Как использовать Ansible Lint для сканирования плейбуков
  2. 🐳 Как определить DNS в контейнерах Docker
  3. 🔬 5 инструментов разработчика для обнаружения и исправления уязвимостей
  4. 🐳 Как использовать Docker Bench for Security для аудита контейнеров
Пожалуйста, не спамьте и никого не оскорбляйте. Это поле для комментариев, а не спамбокс. Рекламные ссылки не индексируются!
Добавить комментарий