Hvis du jobber med Docker, Kubernetes, GitHub Actions eller praktisk talt et hvilket som helst moderne DevOps-verktøy, bruker du allerede YAML, enten du innser det eller ikke. YAML (som står for "YAML Ain't Markup Language" — ja, det er et rekursivt akronym) ble designet for å være det mest lesbare dataformatet for mennesker.

La oss lære det sammen, ett konsept om gangen.

Hvorfor YAML finnes

JSON er flott for maskiner, men har du noen gang prøvd å skrive en 200-linjers konfigurasjonsfil i JSON? Ingen kommentarer, obligatoriske doble anførselstegn overalt, fem nivåer med nestede krøllparenteser... det blir smertefullt raskt. YAML ble laget for å løse dette. Det bruker innrykk i stedet for parenteser, noe som gjør konfigurasjoner rene og lette å skanne.

Her er de samme dataene i JSON og YAML. Ser du forskjellen?

JSON:

json

YAML:

yaml

Det grunnleggende du trenger å vite

Nøkkel-verdi-par er grunnmuren i YAML. Bruk bare kolon og mellomrom: name: John Doe. Det er det — ingen anførselstegn nødvendig for de fleste strenger.

Innrykk er alt. YAML bruker mellomrom (aldri tab!) for å vise struktur. Standarden er 2 mellomrom per nivå. Gjør dette feil og filen din knekker. Seriøst — YAML-spesifikasjonen er streng på dette.

Her er et eksempel på nestede data:

yaml

Lister bruker en bindestrek og et mellomrom. Her er en handleliste i YAML:

yaml

Strenger: vanskeligere enn du tror

De fleste strenger trenger ikke anførselstegn i YAML. Men du bør bruke dem når de inneholder kolon, hashmerker, eller kan bli feiltolket. For eksempel tolkes country: NO som country: false i YAML 1.1 fordi NO behandles som en boolean. Dette er det beryktede "Norge-problemet" og det har forårsaket ekte feil i produksjon.

Er du i tvil, sett det i anførselstegn: country: "NO"

Flerlinjestrenger er fantastiske

Her er det YAML virkelig skinner. Pipe | bevarer linjeskift (flott for skript), mens > bretter dem til mellomrom (flott for lange beskrivelser):

yaml
yaml

Ankere og aliaser: DRY-konfigurasjonsfiler

En av YAMLs kuleste funksjoner. Definer noe én gang med &, referer til det senere med *:

yaml

production-blokken arver retries: 3 fra defaults, men overstyrer timeout. Dette er utrolig nyttig i GitHub Actions-arbeidsflyter og Docker Compose-filer der du ellers ville gjentatt de samme konfigurasjonsblokkene om og om igjen.

De 4 vanligste YAML-feilene

  • Tab i stedet for mellomrom — Editoren din kan sette inn tab som standard. Konfigurer den til å bruke mellomrom for YAML-filer. Seriøst, gjør det nå.
  • Boolean-felleryes, no, on, off, true, false er ALLE boolske verdier i YAML 1.1. Bruk anførselstegn hvis du mener strengen.
  • Kolon i verdiermessage: Error: file not found vil knekke fordi YAML ser en andre nøkkel-verdi-separator. Bruk anførselstegn: message: "Error: file not found"
  • Etterfølgende mellomrom — Usynlige mellomrom på slutten av linjer kan forårsake merkelig parsing-oppførsel. Bruk en editor som fremhever etterfølgende mellomrom.

Hvor du bruker YAML hver dag

YAML er konfigurasjonsspråket for Docker Compose, Kubernetes-manifester, GitHub Actions, GitLab CI, Ansible-playbooks og titalls andre verktøy. Hvis du gjør noe innen DevOps eller sky, er YAML-ferdigheter uunnværlige.

Har du en YAML-fil som oppfører seg rart? Lim den inn i vår YAML Validator for å finne problemet umiddelbart.

YAML i praksis: Docker Compose-eksempel

La oss se på en realistisk Docker Compose-fil — den typen du faktisk ville skrevet for en webapplikasjon:

yaml

Legg merke til et par ting: miljøvariabler kan skrives som en liste (- KEY=value) eller som en mapping (KEY: value). Begge fungerer i Docker Compose — men velg én stil og hold deg til den for konsistens.

YAML i praksis: GitHub Actions CI-pipeline

Her er en GitHub Actions-arbeidsflyt som kjører tester ved hvert push:

yaml

Dette er rent, lesbart og selvforklarende. Forestill deg å skrive den samme arbeidsflyten i JSON — den ville vært dobbelt så lang og mye vanskeligere å skanne visuelt.

YAML vs JSON vs TOML: Rask sammenligning

YAML er ikke det eneste alternativet til JSON for konfigurasjonsfiler. TOML er et annet populært valg (brukt av Rusts Cargo.toml og Pythons pyproject.toml). Slik sammenligner de seg:

EgenskapYAMLJSONTOML
KommentarerJa (#)NeiJa (#)
LesbarhetUtmerketGodMeget god
Nestede strukturerInnrykkKlammeparenteserSeksjoner/punkter
FlerlinjestrengerJa (`, >`)NeiJa (""")
TypeinferensJa (kan være farlig)EksplisittJa (tryggere)
Etterfølgende kommaerN/AIkke tillattTillatt
ØkosystemDevOps, K8s, CI/CDWeb APIs, Node.jsRust, Python

Avansert YAML: Flere dokumenter i én fil

YAML støtter flere dokumenter i en enkelt fil, adskilt med ---. Dette brukes ofte i Kubernetes for å deploye flere ressurser på én gang:

yaml

----separatoren forteller YAML-parseren "dette er et nytt dokument." Du kan kjøre kubectl apply -f på en slik fil og Kubernetes vil opprette begge ressursene.

YAML-sikkerhet: Billion Laughs-angrepet

Her er noe de fleste nybegynnere ikke vet: YAML kan være en sikkerhetsrisiko hvis du ikke er forsiktig. "Billion Laughs"-angrepet bruker ankere og aliaser for å skape eksponentiell datautvidelse:

yaml

Denne lille filen kan utvide seg til gigabyte i minnet og krasje applikasjonen din. Lærdommen? Pars aldri upålitelig YAML-inndata. Bruk sikre lastefunksjoner som yaml.safe_load() i Python i stedet for yaml.load(), og sett minnebegrensninger på YAML-parseren din.

Konvertering mellom YAML og JSON

Siden YAML er et supersett av JSON (ja, gyldig JSON er også gyldig YAML!), er konvertering mellom de to enkel. Dette er nyttig når du vil bruke YAMLs lesbarhet for å skrive konfigurasjoner, men trenger JSON for et API eller verktøy som krever det.

Vår YAML til JSON-konverterer håndterer dette umiddelbart — bare lim inn YAMLen din og få ren JSON-utdata. Den andre veien? All JSON du har er allerede gyldig YAML.

Prøv det selv

Enten du feilsøker et ødelagt Kubernetes-manifest eller setter opp en ny CI-pipeline, vil disse verktøyene spare deg tid:

YAML har sine særheter, men når du først blir komfortabel med innrykksbasert syntaks, vil du sette pris på hvor mye renere konfigurasjonsfilene dine ser ut sammenlignet med JSON-alternativet.