YAML — это не язык разметки или сокращенно YAML — это язык сериализации данных, обычно используемый в файлах конфигурации, таких как Kubernetes, Docker, Ansible и многих других. Его популярность росла с годами, что сделало его своего рода конкурентом JSON.
Хорошо, если YAML не является языком разметки, что это такое?
Как уже упоминалось, YAML — это язык сериализации данных, разработанный для улучшения удобочитаемости за счет использования отступов и собственных структур данных. Думайте об этом как о строгом надмножестве JSON или как о помесье JSON и XML. Этот гибрид позволяет ему делать то, что может JSON, и другие дополнительные функции.
Цель этого руководства — познакомить вас с YAML, дать вам руководство по синтаксису языка, предоставить вам быстрые инструменты для работы с YAML и научить использовать его для файлов конфигурации и многое другое.
Как написать YAML
Написание YAML невероятно интуитивно понятно (я думаю, в этом суть), поскольку он использует синтаксис пары ключ-значение. Таким образом, это похоже на словарь в Python. Однако, в отличие от Python, YAML не позволяет использовать интервалы табуляции; он использует пробелы.
Общий синтаксис:
key: value
Чтобы начать новый документ YAML, мы начинаем с трех тире, обозначающих начало нового файла.
Эта функция позволяет вам иметь несколько документов, разделенных тире, в одном файле.
Создайте файл с расширением.YAML и добавьте следующее содержимое.
—
language: Python
author: Guido van Rossum
country: Netherlands—
language: JavaScript
author: Brendan Eich
country: United States—
language: Ruby
author: Yukihiro Matsumoto
country: Japan
Как видно из приведенного выше файла, каждый документ в yaml начинается с трех точек, за которыми следуют данные, хранящиеся в парах ключ-значение.
Установите YAML linter
Прежде чем продолжить, давайте подтвердим, что у нас есть действующий файл YAML. Для этого нам необходимо установить линтер YAML.
Линтер — это инструмент, который проверяет и уведомляет разработчика об ошибках программирования, таких как синтаксические ошибки и недопустимые конструкции. Например, он позволяет вам проверить допустимый синтаксис файла.
В нашем примере мы будем использовать yamllint.
Для установки используйте apt как:
sudo apt-get update
sudo apt-get install yamllint -y
После установки мы можем запустить линтер для файла с помощью команды
echo -e ‘this is a valid: YAML syntax’ | yamllint sample.yaml
Если файл содержит допустимый синтаксис YAML, он не дает нам никаких результатов.
Теперь попробуйте добавить пробелы внутри файла YAML или добавить один дефис внизу как:
—
language: Python
author: Guido van Rossum
country: Netherlands—
language: JavaScript
author: Brendan Eich
country: United States—
language: Ruby
author: Yukihiro Matsumoto
country: Japan—
Если мы запустим линтер для этого файла, появятся ошибки, как показано ниже:
sample.yaml
15:1 error syntax error: expected <block end>, but found ‘-‘ (syntax)
ПРИМЕЧАНИЕ. Подобно словарям в Python и аналогичным структурам данных в различных языках программирования, пары ключ-значение в документе YAML должны быть уникальными.
Типы данных YAML
YAML поддерживает различные способы представления данных. Они включают:
#: Scalar types
Это наиболее распространенный тип данных в YAML. Они представлены в виде пар «ключ-значение», как показано в примере выше.
Значения в паре могут быть любого типа, например строки, числа, включая шестнадцатеричные, целые числа и т. Д.
#: Strings
YAML также поддерживает строки, заключенные в одинарные или двойные кавычки. Это не является требованием, поскольку синтаксический анализатор YAML определит это, но может быть полезным, особенно в строках с escape-символами.
Ниже приведены примеры действительных строк в YAML.
—
string: This is a string
string2: “This is also a string”
string: ‘so is this one’
ПРИМЕЧАНИЕ. Не забудьте закрыть двойные или одинарные кавычки, если они используются. Следующее приведет к ошибке.
—
invalid: ‘this is incorrect
Чтобы добавить абзац в файл YAML, используйте знак (больше). Не забудьте добавить пробел перед строкой. Например:
—
para: >
creating a paragraphthat spans for more than one
line.
#: Numeric Types
Другой тип данных, поддерживаемый в YAML, — это числовые типы. Числовые типы включают целые, десятичные, шестнадцатеричные, восьмеричные и другие числовые типы.
Следующий синтаксис YAML представляет числовые типы.
—
int: 100
hex: 0x7f000001
octal: 0177
float: 127.0
expo: 6.022e+23
#: Lists
Списки в YAML указываются одним тире как:
—
— list
— another
— and another
#: Sequences
Последовательности — это типы данных, используемые для хранения нескольких значений в одном и том же ключе. Например:
—
server:
— apache— 2.07
— LAMPP
#: Mappings
Сопоставление очень похоже на последовательность, но состоит из пар ключ-значение, содержащихся в одной подгруппе.
Вот пример:
—
Servers:
— apache:
name: server1
os: Debian 10
version: 2.4.46
— IIS:
name: iis-v01
os: Windows Datacenter 2019
version: 10.0.17763
#: Null
мы устанавливаем null в YAML, используя тильду (~) или строку null, как показано в примере ниже:
—
tilde: ~
var: null
#: Arrays
Массивы в YAML указываются в квадратных скобках в одной строке. В следующем примере показано определение массивов в YAML.
—
numbers: [1,2,3,4,5,6,7,8,9,10]
strings: [«Hello», «World», «From», «LinuxHint»]
Комментарии YAML
YAML также поддерживает комментарии, которые позволяют добавлять дополнительную информацию к данным YAML. Парсер игнорирует комментарии.
YAML comments begin with an Octothorpe (#).
—
# This is a comment in YAML
Преобразование YAML в JSON
В некоторых случаях нам может потребоваться преобразовать YAML в JSON. Поскольку они тесно связаны между собой, имеет смысл использовать одно в другом.
Для таких сценариев мы можем использовать такой инструмент, как yq, который представляет собой синтаксический анализатор YAML / XML для jq.
Чтобы установить его, используйте pip с командой, как показано ниже:
pip3 install yq
ПРИМЕЧАНИЕ. Убедитесь, что у вас установлен jq, поскольку это обязательная зависимость для yq.
Предположим, у нас есть образец файла для создания пода Kubernetes (Kubernetes.yaml) с таким содержимым, как показано:
—
apiVersion: v1
kind: Pod
metadata:
name: store-site
labels:
app: web
spec:
containers:
— name: nginx
image: nginx
ports:
— containerPort: 8080
volumeMounts:
— name: master
mountPath: /var/www/html/nginx
dnsPolicy: Default
volumes:
— name: home_directory
emptyDir: {}
ПРИМЕЧАНИЕ. Приведенный выше файл предназначен для иллюстрации и может содержать ошибки при использовании в реальном экземпляре Kubernetes.
Чтобы преобразовать файл YAML в JSON, используйте команду:
sudo yq eval -j kubernetes.yaml
После выполнения приведенной выше команды содержимое файла автоматически преобразуется в JSON, как показано ниже:
{
«apiVersion»: «v1»,
«kind»: «Pod»,
«metadata»: {
«name»: «store-site»,
«labels»: {
«app»: «web»
}
},
«spec»: {
«containers»: [
{
«name»: «nginx»,
«image»: «nginx»,
«ports»: [
{
«containerPort»: 8080
}
],
«volumeMounts»: [
{
«name»: «master»,
«mountPath»: «/var/www/html/nginx»
}
]
}
],
«dnsPolicy»: «Default»,
«volumes»: [
{
«name»: «home_directory»,
«emptyDir»: {}
}
]
}
}
Это упрощает работу при переходе с JSON на YAML и наоборот.
Заключение
YAML — это невероятно мощный инструмент, который позволяет создавать хорошо читаемые и совместимые файлы конфигурации для служб поддержки. Используя концепции этого руководства, вы можете создавать сложные документы YAML для своих приложений или приложений, поддерживающих YAML.