# YAML

Источник: [Введение в YAML](https://ealebed.github.io/posts/2018/знакомство-с-kubernetes-часть-17-введение-в-yaml/)

YAML (Yet Another Markup (разметка) Language или YAML Ain’t Markup Language) - структурированный формат описания конфигурациий.

По сути, YAML - это надмножество (superset) JSON => любой валидный (правильный) JSON-файл также является валидным файлом YAML

Для создания корректного описания манифеста в YAML-формате достаточно знать только два типа структур:

* списки (sequence, lists): `- item`;
* мапы (maps): `key: value`.

### Мапы (maps): `key: value`

Знакомство с мапами (maps). Мапы позволяют связывать (маппить) пары ключ-значение - это то, что нужно при описании конфигурационных файлов. Н/р, у вас может быть файл конфигурации, который выглядит следующим образом:

```yml
---
apiVersion: v1
kind: Pod
```

В YAML файле три дефиса (---) обозначают начало нового документа yaml, позволяет размещать несколько YAML-документов в одном файле. В данном случае, после --- начинается описание ресурса Kubernetes (Pod).

В формате JSON это выглядело бы так:

```json
{
   "apiVersion": "v1",
   "kind": "Pod"
}
```

Можно описывать более сложные структуры. Могут быть мапы списков (или списки мап). Пример со значением для определенного ключа может быть еще одна мапа:

```yml
---
apiVersion: v1      # МАПА (ключ "apiVersion") -> скаляр "v1"
kind: Pod           # МАПА -> скаляр "Pod"
metadata:           # МАПА -> значение - другая мапа
  name: test-site   #   МАПА -> скаляр "test-site"
  labels:           #   МАПА -> мапа
    app: web        #     МАПА -> скаляр "web"
```

Как видим, у ключа metadata значением будут еще две мапы (с ключами name и labels), а у ключа labels, в свою очередь, значением будет мапа с ключом app. Можно создавать такие структуры любого уровня вложенности - все зависит от ваших потребностей.

YAML-процессор “понимает” связанность этих элементов благодаря форматированию - обратите внимание на отступы. В этом примере для отступов используются 2 пробела, но на самом деле количество пробелов не имеет значения - главное соблюдать уровни отступов. Н/р, ключи `name` и `labels` находятся на одном уровне отступов => процессор будет считать, что они являются значением для ключа одной и той же мапы; точно также YAML-процессор знает, что `app` - это значение для ключа `labels`.

❗ Небольшой совет: не стоит использовать в YAML-файле в качестве отступов табуляцию.

Итак, если этот пример преобразовать в JSON, то получим следующее:

```json
{
  "apiVersion": "v1",
  "kind": "Pod",
  "metadata": {
               "name": "test-site",
               "labels": {
                          "app": "web"
                         }
              }
}
```

### Cписки (sequence, lists): `- item`;


Что касается YAML-списков, то по сути это просто перечисление объектов, например:

```yml
args
  - sleep
  - "1000"
  - message
  - "Hello world!"
```

Как видно из примера, можно указать любое количество элементов в списке (главное, чтобы каждый новый элемент находится в отдельной строке и начинался с дефиса). В JSON это будет выглядеть так:

```json
{
   "args": ["sleep", "1000", "message", "Hello world!"]
}
```

Ну и конечно же элементами списка могут быть мапы:

```yml
---
apiVersion: v1
kind: Pod
metadata:
  name: test-site
  labels:
    app: web
spec:
  containers:
    - name: front-end
      image: nginx
      ports:
        - containerPort: 80
    - name: test
      image: ealebed/test:v1
      ports:
        - containerPort: 88
```

Эквивалент в JSON-формате:

```json
{
   "apiVersion": "v1",
   "kind": "Pod",
   "metadata": {
                 "name": "test-site",
                 "labels": {
                             "app": "web"
                           }
               },
    "spec": {
       "containers": [{
                       "name": "front-end",
                       "image": "nginx",
                       "ports": [{
                                  "containerPort": "80"
                                 }]
                      }, 
                      {
                       "name": "test",
                       "image": "ealebed/test:v1",
                       "ports": [{
                                  "containerPort": "88"
                                 }]
                      }]
            }
}
```

---

[4.2.3.2 iOS Data Persistance Folder](./4.2.3.2%20iOSDataPersistance/) | [Back To iTWiki Contents](https://github.com/eldaroid/iTWiki) | [4.2.4 Design Theme Folder](../4.2.4%20Design/)
