Technologie/Nástroje

YAML

Co je to YAML?

YAML (YAML Ain't Markup Language) je čitelný formát pro serializaci dat a konfigurační soubory, který se stal de facto standardem v moderním DevOps světě a automatizaci infrastruktury. Název YAML je rekurzivní zkratka – původně znamenal "Yet Another Markup Language" (Další značkovací jazyk), ale tvůrci ho později změnili na "YAML Ain't Markup Language" (YAML není značkovací jazyk), aby zdůraznili, že YAML se zaměřuje na data, nikoli na dokumenty. YAML vznikl v roce 2001 jako lidsky čitelná alternativa k XML a JSON pro konfigurační soubory. Hlavní filozofií YAML je maximální čitelnost – strukturu definujete pomocí odsazení (jako v Pythonu) místo složených závorek nebo XML tagů. To činí YAML konfigurace intuitivní i pro ne-programátory, což je klíčové pro DevOps týmy, kde s konfigurací pracují různé role. YAML soubory typicky mají příponu .yml nebo .yaml. Používají ho téměř všechny moderní DevOps nástroje – Docker Compose (docker-compose.yml), Kubernetes (manifesty), Ansible (playbooks), GitLab CI/CD (.gitlab-ci.yml), GitHub Actions (workflows), Helm (charts) a mnoho dalších. YAML je nadmnožina JSON, což znamená, že každý validní JSON dokument je zároveň validní YAML dokument – můžete vložit JSON do YAML souboru a bude fungovat. Důležité je pochopit, že YAML není programovací jazyk – je to formát pro reprezentaci strukturovaných dat, podobně jako JSON nebo XML.

K čemu se YAML používá?

YAML dominuje v oblasti konfigurace aplikací a infrastruktury jako kódu (Infrastructure as Code). Docker Compose používá YAML pro definici multi-container aplikací – specifikujete, které služby běží, jaké porty otevírají, jaké volumes mountují. Kubernetes manifesty v YAML popisují celý stav clusteru – Pods, Services, Deployments, ConfigMaps. Díky tomu můžete verzovat infrastrukturu v Git repository stejně jako aplikační kód. CI/CD pipelines jsou další dominantní použití YAML. GitLab CI, GitHub Actions, CircleCI, Travis CI – všechny definují build a deployment procesy v YAML. Píšete, jaké joby běží, v jakém pořadí, za jakých podmínek, na jakých runnerech. YAML konfigurace pipeline je pak součástí kódu projektu. Configuration management nástroje jako Ansible a Salt Stack používají YAML pro playbooks a states – deklarativní popis požadovaného stavu systémů. Místo imperativních skriptů píšete, že chcete nginx verze X s konfigurací Y běžící na portu Z, a nástroj zajistí, že se to stane. YAML najdete také v aplikačních konfiguracíchframeworky jako Symfony, Spring Boot nebo Ruby on Rails používají YAML pro config soubory (config.yml, application.yml). YAML je také oblíbený pro datové soubory v projektech – překladové slovníky (i18n), seed data pro databáze, fixture soubory pro testy.

Základní syntaxe YAML

  • Odsazení a struktura

  • YAML používá odsazení (indentaci) pro hierarchii – každá úroveň vnořenosti je odsazena mezerami. Kriticky důležité: YAML NEPODPORUJE TABULÁTORY – používejte výhradně mezery, běžně 2 nebo 4 na úroveň. Míchání mezer a tabulátorů způsobí chybu parsování. Konzistentní odsazení je klíčové – pokud začnete s 2 mezerami, držte se toho v celém souboru. Většina editorů umí automaticky konvertovat Tab na mezery.

  • Klíče a hodnoty (Key-Value páry)

  • Základní struktura YAML je klíč: hodnota. Za klíčem následuje dvojtečka a mezera, pak hodnota. Příklad: název: Webouky, port: 8080, enabled: true. Hodnoty mohou být stringy (s uvozovkami nebo bez), čísla, boolean (true/false), null. Uvozovky jsou volitelné, pokud string neobsahuje speciální znaky. Pro víceřádkové stringy používejte | (zachová nové řádky) nebo > (složí do jednoho řádku).

  • Seznamy a pole

  • Seznamy se značí pomlčkou a mezerou před každou položkou. Příklad: - jablko, - hruška. Seznamy můžou být také inline ve formátu [item1, item2, item3] (JSON style). Můžete mít seznamy objektů – každá položka začíná pomlčkou a obsahuje vlastní key-value páry odsazené dovnitř.

  • Vnořené struktury

  • YAML podporuje libovolně hluboké vnořování objektů a polí. Každá vnořená úroveň je odsazena. Příklad: objekt databáze obsahuje host, port a credentials, kde credentials je další objekt s username a password. Vnořování kombinujete s poli – seznam objektů, objekty obsahující pole objektů atd.

  • Komentáře v YAML

  • Komentáře začínají znakem # a pokračují do konce řádku. YAML komentáře podporuje nativně, na rozdíl od JSON (který komentáře nemá). To činí YAML výborným pro dokumentovanou konfiguraci – můžete vysvětlit, co jednotlivé sekce dělají, proč jsou určité hodnoty nastaveny tak jak jsou. Komentáře jsou ignorovány parserem a slouží čistě pro lidi.

YAML vs JSON – jaký je rozdíl?

YAML a JSON řeší podobné problémy, ale s různým důrazem. JSON (JavaScript Object Notation) je kompaktnější, používá složené závorky a vyžaduje uvozovky u všech stringů. Je strojově čitelnější a parsování je obecně rychlejší. JSON dominuje v API komunikaci – když frontend volá backend, data obvykle putují jako JSON. Je univerzální – každý programovací jazyk má JSON parser.

YAML je čitelnější pro lidi díky absenci závorek a minimálnímu použití interpunkce. Odsazení vytváří vizuální hierarchii, která je intuitivnější než závorky. YAML podporuje komentáře (JSON ne), což je zásadní pro dokumentaci konfigurace. YAML má také pokročilé funkce jako anchors a aliases (znovupoužití částí konfigurace), merge keys a custom tags. JSON tyto featury nemá – je jednodušší, ale méně expresivní.

Kdy použít co? YAML je lepší volba pro konfigurační soubory, které budou číst a editovat lidé – Docker Compose, Kubernetes manifesty, CI/CD pipelines. JSON je lepší pro API komunikaci, config soubory generované programaticky a situace, kde potřebujete maximální rychlost parsování. Důležité je, že YAML je nadmnožina JSON – můžete vložit JSON do YAML souboru a bude fungovat. Opačně to obecně neplatí.

Praktické příklady YAML konfigurace

Docker Compose soubor definuje multi-container aplikaci. Specifikujete služby (services), každá má image nebo build instrukce, porty, volumes, environment variables, závislosti na jiných službách. YAML struktura dělá Compose soubory čitelné i pro komplexní aplikace s desítkami služeb.

Kubernetes manifest popisuje Deployment nebo Service. Uvedete apiVersion, kind (typ objektu), metadata (jméno, labels) a spec (specifikace – kolik replik, jaký image, jaké porty, resource limits). Kubernetes YAML je deklarativní – popisujete požadovaný stav, kontrolér zajistí, že cluster odpovídá.

GitHub Actions workflow definuje CI/CD pipeline. Specifikujete, na jaké události reagovat (push, pull request), jaké joby spustit, na jakých runners, jaké steps každý job obsahuje (checkout kódu, build, test, deploy). YAML workflow je verzován s kódem v .github/workflows/.

Ansible playbook popisuje konfiguraci serverů. Definujete hosts (na kterých strojích běžet), tasks (jaké akce provést – instalace balíčků, kopírování souborů, restart služeb), variables, handlers. Ansible pak zajistí, že servery odpovídají požadované konfiguraci.

Výhody a nevýhody YAML

Výhody:

  • Vysoká čitelnost

  • Struktura pomocí odsazení je intuitivní a konfigurace vypadají čistě. I ne-programátoři dokážou pochopit základní strukturu YAML souboru na první pohled.

  • Podpora komentářů

  • Můžete dokumentovat konfiguraci přímo v souboru. To je zásadní výhoda oproti JSON, který komentáře nepodporuje. Dokumentované konfigurace usnadňují týmovou spolupráci.

  • Méně verbózní

  • Žádné složené závorky, méně uvozovek, čistší syntax než JSON nebo XML. YAML konfigurace jsou kompaktnější a příjemnější na čtení i psaní.

  • Pokročilé funkce

  • Anchors, aliases a merge keys umožňují DRY (Don't Repeat Yourself) konfiguraci. Můžete znovu použít části konfigurace bez duplikace kódu.

  • Široká adopce v DevOps

  • Standardní formát pro Kubernetes, Docker, CI/CD nástroje. Naučíte se jednu syntaxi a použijete ji napříč celým DevOps ekosystémem.

Nevýhody:

  • Citlivost na whitespace

  • Chyba v odsazení způsobí nevalidní soubor a tabulátory nejsou povoleny. Nekonzistentní odsazení je nejčastější příčinou chyb u začátečníků.

  • Pomalejší parsování

  • YAML je složitější než JSON, takže parsing zabere více času a paměti. Pro většinu aplikací to není problém, ale u velmi velkých souborů může být rozdíl znatelný.

  • Bezpečnostní rizika

  • YAML podporuje custom tags a object deserialization, což může vést ke code execution, pokud parsujete nedůvěryhodný vstup. Vždy používejte safe loading mode pro externí data.

  • Nejednoznačná syntax

  • Některé edge cases mohou být matoucí. Například hodnota no se parsuje jako boolean false, ne jako string. Pokud chcete string, musíte použít uvozovky: "no".

Nejčastější chyby při psaní YAML

  • Používání tabulátorů místo mezer

  • YAML tabulátory explicitně zakazuje – musíte používat mezery. Většina chyb "invalid YAML syntax" je způsobena tabulátory nebo nekonzistentním odsazením. Nastavte svůj editor tak, aby konvertoval Tab na mezery a zobrazoval whitespace znaky.

  • Nekonzistentní odsazení

  • Použijete někde 2 mezery, jinde 4 mezery nebo dokonce 3. YAML to odmítne. Vyberte si standard (obvykle 2 nebo 4 mezery) a držte se ho v celém souboru. Dobré editory (VS Code, Sublime) umí automaticky formátovat YAML.

  • Zapomenuté mezery za dvojtečkou

  • YAML vyžaduje mezeru po : v key-value párech. key:value je chyba, správně je key: value. Totéž platí pro seznamy – -item je chyba, - item je správně.

  • Boolean a string záměna

  • Hodnoty yes, no, on, off, true, false se parsují jako boolean. Pokud chcete string "no", musíte použít uvozovky: "no". Obdobně čísla v uvozovkách jsou stringy: "123" vs 123.

  • Neošetřené speciální znaky

  • Pokud hodnota obsahuje :, #, [, { nebo začíná &, *, musíte ji dát do uvozovek. Jinak YAML parser havaruje nebo interpretuje hodnotu špatně. Při nejistotě dávejte stringy do uvozovek.

Nejčastější otázky o YAML

K čemu slouží YAML? Rozbalit

YAML slouží především pro konfigurační soubory aplikací, DevOps nástrojů a automatizačních systémů. Používají ho platformy jako Docker (docker-compose.yml), Kubernetes (manifesty), GitLab CI/CD (.gitlab-ci.yml), Ansible (playbooks) nebo GitHub Actions (workflows). YAML je oblíbený pro svou čitelnost – struktura pomocí odsazení je intuitivní a snadno pochopitelná i pro ne-programátory. Díky tomu je ideální pro týmovou spolupráci a dokumentaci infrastruktury jako kódu.

Jaký je rozdíl mezi YAML a JSON? Rozbalit

YAML a JSON jsou oba formáty pro strukturovaná data, ale liší se v syntaxi a účelu. YAML používá odsazení místo závorek, podporuje komentáře a je čitelnější pro lidi – ideální pro konfiguraci. JSON používá závorky a uvozovky, je kompaktnější a strojově čitelnější – běžný pro API komunikaci. YAML je nadmnožina JSON, což znamená, že validní JSON je zároveň validní YAML. YAML se často používá pro konfiguraci, zatímco JSON pro přenos dat mezi aplikacemi.

Je YAML těžké se naučit? Rozbalit

YAML je relativně snadné se naučit, zejména pokud už znáte základy programování nebo JSON. Hlavní pravidla jsou intuitivní: struktura pomocí odsazení (mezery, ne tabulátory!), dvojtečka pro key-value páry, pomlčka pro seznamy. Nejčastější chybou začátečníků je nekonzistentní odsazení. Základní syntaxi se naučíte za pár hodin, pokročilé funkce jako anchors nebo multi-line strings vyžadují praxi. Existuje mnoho online validátorů pro kontrolu syntaxe.

Proč se YAML tak často používá v DevOps? Rozbalit

YAML dominuje v DevOps světě díky své čitelnosti a expresivitě. Když definujete infrastrukturu jako kód (Infrastructure as Code), potřebujete formát, který je srozumitelný celému týmu včetně non-developerů. YAML konfigurace lze snadno verzovat v Gitu, reviewovat v pull requestech a dokumentovat pomocí komentářů. Většina moderních DevOps nástrojů (Kubernetes, Ansible, GitLab CI, GitHub Actions, Docker Compose) standardně používá YAML. Jeho adopce vytvořila ekosystém kompatibilních nástrojů.

Související pojmy