# YAML

## Uvod

Kao DevOps praktikanti cesto koristimo razlicite konfiguracijske fajlove da bi alatima koje koristimo proslijedili odredjene informacije i konfiguracijska podesenja. Konfiguracijski fajlovi se najcesce pisu koristeci **DSL (Data Serialization Languages).**  U racunarstvu (*eng. computing),* seralizacija oznacava proces prevodjenja strukture podataka ili stanja objekata u format koji moze da pohranjuje ili prenosi i kasnije rekonstruise na nacin da je razumljiv u razlicitim racunarskim okruzenjima. Neki od najpoznatijih DSL jezika su YAML, JSON i XML. Pored potrebe da se podaci predstave na nacin koji je lako citljiv i koji moze biti ponovo rekonstruisan bilo je potrebno omoguciti razlicitim programskim jezicima i racunarskim sistemima da razmjenjuju podatke na **interoperabilan** nacin (*interoperabilnost predstavlja sposobnost dvije ili vise komponenti ili sistema da razmjenjuju informacije i koriste informacije koje su razmijenjene*).

## YAML

**YAML (*****YAML Ain’t Markup Language*****)** pripada grupi DSL jezika koji je kreiran da bi ljudima bio jednostavan za citanje i pisanje. Pored svoje jednostavnosti za citanje i pisanje, YAML radi odlicno sa modernim programskim jezicima. YAML za struktuisanje podataka koristi **indentaciju (eng. indentation**)**, nizove**, **mape** (parove *kljuc: vrijednost* / key: *value pairs*). Prije nego se detaljnije upoznamo sa YAML jezikom neophodno je da razumijemo sta svaki od ovih ranije pobrojanih pojmova za strukturiranja podataka predstavlja:

* **indentacija (eng. indentation)** - odnosi se na nacin uredjivanja ili pomjeranja linija koda u odnosu na lijevu marginu radi vizuelne organizacije i strukturiranja blokova koda. Obicno se koristi tabulator (***tab***) ili niz razmaka (**space**) da bi se linije koda pomjerile udesno. **YAML koristi indentaciju (obicno sa razmacima) za oznacavanje hijerarhijske strukture podataka. Indentacija je vazna za odredjivanje koje elemente podatka cini dio drugih elementa (blokova).**&#x20;
* **mape -** se u YAML formatu definisu kao parovi **kljuc: vrijednost (key: value)**. Ova struktura podataka se u nekim jezicima naziva i kao **hash** ili **dictionary:**

```yaml
sarajevo: 500000
zagreb: 800000
beograd: 1700000
podgorica: 200000
```

&#x20;     Primjer mape sa setom osobina grupisanih zajedno bi bio:

```yaml
sarajevo:
  drzava: "Bosna i Hercegovina"
  stanovnika: 500000
zagreb:
  drzava: "Hrvatska"
  stanovnika: 800000
beograd: 
  drzava: "Srbija"
  stanovnika: 1700000
podgorica: 
  drzava: "Crna Gora"
  stanovnika: 200000
```

* **sekvence (nizovi / liste)** - (eng. Sequences arrays/lists) odnosno nizovi ili liste elemenata se u YAML-u predstavljaju kao lista elementa gdje svaki elemenat pocinje sa crticom i razmakom:

```yaml
- sarajevo
- zagreb
- beograd
- podgorica
```

* **skalari (brojevi / stringovi) -** predstavljaju osnovne elemente podataka kao sto su brojevi, stringovi, boolean (true/false) i null vrijednosti. U YAML-u, skalarne vrijednosti pisemo direktno. Brojevi se pisu kao brojevi, dok se stringovi pisu izmedju navodnih znakova:

```yaml
broj: 123
string: "ovo je string"
```

Bitno je napomenuti da YAML podrzava ugnijezdjenja mapa i sekvenci sto znaci da se mape mogu koristiti kao vrijednosti unutar sekvenci i obrnuto, omogucavajuci slozenije strukture podataka. Ispod je jedan primjer slozene strukture podataka u YAML-u.

```yaml
BiH:
  - grad: Sarajevo
  - stanovnika: 500000
Hrvatska:
  - grad: Zagreb
  - stanovnika: 800000
Srbija:
  - grad: Beograd
  - stanovnika: 1700000
CrnaGora:
  - grad: Podgorica
  - stanovnika: 200000
```

**NOTE: Mape (Dictionary/Hash) su jednake bez obzira na poredak njihovih elemenata (eng. properties). U primjerima ispod mapa 1 je jednaka mapi 2.**&#x20;

```yaml
#PRIMJER MAPE 1
sarajevo:
  drzava: "Bosna i Hercegovina"
  stanovnika: 500000
  
#PRIMJER MAPE 2
sarajevo:
  stanovnika: 500000
  drzava: "Bosna i Hercegovina"
```

**To nije slucaj sa listama, liste su poredane (eng. ordered) kolekcije podataka sto znaci da je poredak elemenata unutar liste bitan. Na primjeru ispod dvije liste nisu jednake iz razloga sto se poredak elemenata u listama razlikuje.**

```yaml
# Lista 1
BiH:
  - sarajevo
  - mostar
  - tuzla
  - banjaluka
  - neum
  
# Lista 2
BiH:
  - banjaluka
  - neum
  - mostar
  - tuzla
  - sarajevo
```

Takodjer bitno je napomenuti da je YAML superset JSON-a sto znaci da svaki validan JSON dokument takodjer predstavlja i validan YAML dokument.

## Dodatna Literatura

Ukoliko zelite prosiriti svoje znanje o YAML-u preporuka je da pogledate sljedecu dodatnu literaturu:

* [YAML Ain’t Markup Language (YAML™) version 1.2](https://yaml.org/spec/1.2.2/)
* [YAML - Tutorials Point](https://github.com/allops-solutions/devops-aws-mentorship-program/blob/main/resources/books/YAML_Tutorials_Point.pdf)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://devops.awsbosnia.com/devops-learning-path/yaml.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
