track
De-a lungul anilor, am lucrat cu nenumărate fișiere de configurare, iar YAML s-a remarcat prin simplitatea și lizibilitatea sa. Fie că setezi fluxuri de lucru în Kubernetes, definești servicii în Docker sau structurezi cereri către API, YAML face configurațiile complexe mai ușor de gestionat. Structura sa curată, bazată pe indentare, elimină aglomerația formatelor precum XML, rămânând în același timp flexibilă.
În acest ghid, te voi conduce prin sintaxa, structura, funcțiile avansate și bunele practici YAML, ca să poți lucra cu încredere.
Ce este YAML?
YAML (Yet Another Markup Language / YAML Ain’t Markup Language) este un format de serializare a datelor care dă prioritate lizibilității și ușurinței de utilizare. În timp ce XML folosește un amestec de etichete încapsulate, asemănătoare HTML, iar JSON folosește acolade și ghilimele, la fel ca dicționarele din Python, YAML este mai concis și folosește indentarea pentru a defini structura, fiind mai prietenos pentru oameni.
YAML acceptă diverse tipuri de date, inclusiv scalare (șiruri, numere, valori boolean), secvențe (liste) și mapări (perechi cheie–valoare). Este folosit pe scară largă în fișiere de configurare, automatizarea infrastructurii și schimb de date, în special în instrumente precum Kubernetes, Docker și Ansible.
În plus, YAML este un superset al JSON, ceea ce înseamnă că fișierele JSON valide pot fi parcurse ca YAML. Fișierele YAML au de obicei extensia .yaml sau .yml.
Poți afla mai multe despre YAML și pe site-ul său!
Sintaxa și structura YAML
În această secțiune vom explora principiile de bază ale sintaxei YAML, inclusiv perechi cheie–valoare, liste, date imbricate și comentarii.
Reguli de bază ale sintaxei
Există câteva reguli sintactice de bază pentru YAML:
- Indentarea cu spații denotă structura, deci evită tab-urile!
- Perechile cheie–valoare urmează structura
cheie: valoare, similar altor limbaje. - Folosirea cratimelor la începutul liniilor denotă o listă.
- Folosirea
#va crea linii de comentariu.
# Here is an example of YAML
name: John Doe
age: 30
skills:
- Python
- YAML
Perechi cheie–valoare
YAML reprezintă datele ca perechi cheie–valoare, similar dicționarelor din Python. Acest lucru denotă adesea informații oferite diferitelor fișiere de configurare și setări. Nu este nevoie să pui șirurile sau cheile între ghilimele; scrie pur și simplu cheia și valorile necesare:
location: New York
country: USA
security-level: user
Liste în YAML
Listele sunt reprezentate folosind cratime (-). Acest lucru îți permite să listezi mai multe obiecte sub o singură cheie. Adesea sunt redate vizual cu puncte când sunt citite de editorii de markup.
fruits:
- Apple
- Banana
- Cherry
Date imbricate
Structurile imbricate permit reprezentarea ierarhică a datelor folosind indentarea. Gândește-te la ele ca la dicționare imbricate. Prin indentare, indici ce chei sunt subseturi ale altora.
person:
name: Alice
details:
age: 25
city: London
Comentarii
Comentariile încep cu # și sunt ignorate de parser-ele YAML. Aceste comentarii sunt pe o singură linie.
# This is a comment
username: admin
password: secret
Funcții avansate YAML
YAML include funcții puternice precum șiruri pe mai multe linii, tipuri de date și ancore, care fac documentele mai eficiente și mai structurate. În această secțiune, vom explora aceste capabilități cu exemple practice.
Șiruri pe mai multe linii
YAML acceptă șiruri pe mai multe linii folosind | (bloc literal) sau > (bloc pliat).
- Blocul literal
|va crea o linie nouă\npentru fiecare întrerupere de linie. - Blocul pliat
>va face o linie nouă doar pentru întreruperi de linie consecutive.
literal: |
This is a
multi-line string.
folded: >
This is another
multi-line string.
Cel mai bine se înțelege de mai sus arătând rezultatul.
- Pentru
|(blocul literal):
This is a
multi-line string.
- Pentru
>(blocul pliat):
This is another multi-line string.
Tipuri de date în YAML
YAML acceptă diverse tipuri de date, inclusiv șiruri, numere, valori boolean și valori nule. Detectează automat tipurile pe baza formatării, dar permite și definiții explicite de tip.
Următorul exemplu arată utilizarea tipurilor de bază în YAML:
string_implicit: Hello, YAML! # No quotes needed unless necessary
string_double_quoted: "Supports escape sequences like \n and \t"
string_single_quoted: 'Raw text, no escape sequences'
integer: 42 # Whole numbers
float: 3.14 # Numbers with decimals
boolean_true: true
boolean_false: false
null_value: null # Null value
null_tilde: ~ # Another way to represent null
YAML permite declarații explicite de tip folosind !!type atunci când este nevoie:
explicit_string: !!str 123 # Forces 123 to be a string
explicit_integer: !!int "42" # Forces "42" to be an integer
explicit_float: !!float "3.14" # Forces "3.14" to be a float
Deoarece YAML este folosit adesea pentru date structurate, acceptă:
- Liste (secvențe):
fruits:
- Apple
- Banana
- Cherry
- Dicționare (mapări):
person:
name: Alice
age: 30
is_student: false
Ancore și aliasuri
YAML îți permite să definești valori reutilizabile folosind ancore (&) și să le faci referire ulterior folosind aliasuri (*). Acest lucru ajută la reducerea redundanței în fișierele de configurare, făcându-le mai curate și mai ușor de întreținut.
defaults: &default_settings
retries: 3
timeout: 30
server1:
host: example.com
retries: *default_settings # Reuses the retries value from defaults
Sintaxa <<: permite îmbinarea perechilor cheie–valoare dintr-o ancoră într-o altă mapare. Dacă o cheie există în ambele, noua valoare o suprascrie pe cea inițială.
defaults: &default_settings
retries: 3
timeout: 30
server1:
<<: *default_settings # Merges all key-value pairs from default_settings
host: example.com # This key is added to the merged data
Aceasta este structura finală rezultată:
server1:
retries: 3
timeout: 30
host: example.com
Ancorele și aliasurile sunt deosebit de utile în fișierele mari de configurare, unde repetarea valorilor manual ar fi ineficientă. Ele ajută la păstrarea fișierelor YAML DRY (Don't Repeat Yourself) și fac actualizările mai ușoare.
Cazuri de utilizare comune pentru YAML
YAML este folosit pe scară largă în dezvoltarea software, automatizarea infrastructurii și managementul API-urilor. Sintaxa sa ușor de citit îl face un format preferat pentru fișiere de configurare, serializarea datelor și Infrastructure as Code (IaC). Să explorăm cele mai comune aplicații.
Fișiere de configurare
YAML este folosit pe scară largă pentru configurare în aplicații precum Docker Compose, Kubernetes și pipeline-uri CI/CD. Ușurința de înțelegere îl face simplu pentru oricine să ia fișierele YAML de configurare Docker și să înțeleagă ce se întâmplă.
version: '3'
services:
web:
image: nginx
ports:
- "80:80"
environment:
- NGINX_HOST=localhost
- NGINX_PORT=80
Lizibilitatea YAML și suportul pentru ancore și aliasuri ajută la reducerea repetițiilor, făcându-l mai ușor de întreținut decât JSON sau XML.
Află mai multe despre YAML și utilizarea sa în Docker în acest curs de nivel intermediar Docker.
Serializare și transfer de date
YAML este folosit pentru a serializa date pentru API-uri și instrumente de management al configurațiilor, transformând structuri complexe de date într-un format ușor de citit de oameni și ușor de parsat de mașini.
De exemplu, un corp de cerere către un API formatat în YAML:
user:
id: 123
name: "John Doe"
email: "johndoe@example.com"
active: true
Structura YAML bazată pe indentare elimină sintaxa inutilă, făcându-l mai ușor, mai lizibil și mai simplu de modificat comparativ cu JSON.
Infrastructure as Code (IaC)
Instrumente de management al configurațiilor precum Ansible și Kubernetes folosesc YAML pentru a defini stările sistemului, a automatiza procese și a asigura consistența între medii.
- În Ansible, YAML este folosit pentru a scrie playbook-uri care definesc stări de sistem, taskuri și dependențe, asigurând configurarea consecventă a componentelor infrastructurii.
- Kubernetes utilizează manifeste YAML pentru a defini resurse precum pod-uri, servicii și deployment-uri, permițând orchestrarea automată a aplicațiilor containerizate.
Iată un exemplu de configurare a unui Pod Kubernetes:
apiVersion: v1
kind: Pod
metadata:
name: my-app
spec:
containers:
- name: app-container
image: my-app:latest
ports:
- containerPort: 8080
Află mai multe despre cum este folosit YAML în Kubernetes în acest curs Introducere în Kubernetes.
Documentarea API-urilor
Specificații de API precum OpenAPI și Swagger folosesc YAML pentru a defini endpoint-uri și structuri de date într-un mod ușor de citit. YAML este folosit pentru a descrie metodele API, parametrii cererii, formatele răspunsurilor și metodele de autentificare.
Iată un exemplu de specificație OpenAPI în YAML:
openapi: 3.0.0
info:
title: User API
version: "1.0"
paths:
/users:
get:
summary: Retrieve a list of users
responses:
"200":
description: Successful response
Specificațiile OpenAPI, de exemplu, folosesc YAML pentru a documenta API-uri RESTful. Astfel pot oferi un plan clar pentru generarea de SDK-uri pentru clienți, documentație API interactivă și testare automată. Acest format structurat asigură consistență între implementările de API.
Lucrul cu fișiere YAML
YAML este folosit pe scară largă pentru fișiere de configurare, automatizare și serializarea datelor, dar, deoarece se bazează pe indentare, formatarea corectă este esențială. Iată cum poți citi, scrie, valida și edita YAML eficient.
Citirea și scrierea YAML în Python
Biblioteca PyYAML din Python poate parsa și genera YAML.
Imaginează-ți că ai următorul fișier YAML de configurare:
database:
host: localhost
port: 5432
user: admin
password: secret
Iată cum poți lucra cu fișierul tău de configurare în Python:
import yaml
# Load YAML data
with open("config.yaml", "r") as file:
data = yaml.safe_load(file) # safe_load prevents arbitrary code execution
# Modify data (optional)
data["database"]["user"] = "new_user"
# Write YAML data
with open("output.yaml", "w") as file:
yaml.dump(data, file, default_flow_style=False)
Dacă ești interesat să lucrezi cu date JSON în Python, aruncă o privire la tutorialul cuprinzător Python JSON.
Validarea fișierelor YAML
Pentru a asigura structura corectă, poți folosi instrumente pentru a verifica tab-uri în loc de spații sau probleme ciudate precum caractere repetate, probleme de sintaxă și spații de final.
Acestea sunt câteva validatoare YAML populare:
- Instrument CLI: yamllint (linter bazat pe Python)
- Validatoare online: YAML Lint, YAML Validator de la JSON Formatter
Editarea YAML
Poți scrie și edita YAML în orice editor de text, dar instrumentele de linting și evidențierea sintaxei îmbunătățesc lizibilitatea.
Câteva dintre editorii mei preferați:
- VS Code (cu pluginuri YAML)
- PyCharm (suport integrat)
- Sublime Text (cu evidențierea sintaxei YAML)
Greșeli comune de evitat în YAML
În ciuda simplității sale, poți avea în continuare probleme și erori de tastare când lucrezi cu YAML. Această secțiune discută aceste greșeli și oferă bune practici pentru a scrie fișiere curate și corecte. De aceea recomand să folosești un linter sau un editor de text!
Amestecarea tab-urilor și spațiilor
YAML se bazează pe spații pentru indentare — nu amesteca niciodată spații și tab-uri. Tab-urile pur și simplu îți vor strica scriptul YAML. Aceasta este de fapt o decizie conștientă, deoarece sisteme diferite citesc tab-urile diferit și, astfel, pentru a minimiza impactul, spațiile sunt preferate.
Indentare incorectă
Asigură-te că ai o indentare consecventă pentru a evita erorile de parsare. Deoarece indentările sunt singura metodă a YAML de a denota ierarhia, parsarea improprie poate cauza probleme cu codul tău. Poți foarte ușor să „ascunzi” o pereche cheie: valoare în locul greșit, așa că fii atent la indentări!
Uitarea ghilimelelor pentru caractere speciale
Folosește ghilimele pentru șiruri care conțin caractere speciale sau spații. Elemente precum backslash-uri, virgule, semne de exclamare ș.a.m.d. au nevoie de ghilimele pentru a fi citite ca șiruri.
path: "/home/user/documents"
message: "Hello, World!"
Folosind o validare corespunzătoare, editare structurată și PyYAML din Python, poți lucra eficient cu fișiere YAML, evitând în același timp capcanele comune.
Concluzie
YAML este un format puternic, dar simplu, folosit pe scară largă în configurare, serializarea datelor și automatizarea infrastructurii. Înțelegând sintaxa, structura și bunele practici, poți lucra eficient cu YAML în diverse aplicații.
Dacă ești interesat să aplici YAML în scenarii reale:
- Învață cum este folosit YAML în fluxurile de lucru CI/CD cu acest curs CI/CD pentru Machine Learning.
- Explorează cum folosesc API-urile YAML în specificațiile lor în acest curs Introducere în API-uri în Python.
- Intră mai adânc în containerizare și automatizarea infrastructurii în acest parcurs Containerizare și Virtualizare.
Întrebări frecvente
YAML este universal?
Atâta timp cât sursa sau destinația datelor poate citi YAML, este o metodă viabilă și utilă de serializare și transport al datelor. Asigură-te că trimiți date către o destinație care poate procesa YAML.
YAML este sigur? Pot introduce fișierele YAML riscuri de securitate?
YAML în sine este doar un format de date, dar riscurile de securitate apar la parsarea fișierelor YAML neverificate. Metoda implicită yaml.load() din PyYAML pentru Python poate executa cod arbitrar încorporat în YAML, ceea ce este riscant. În schimb, folosește întotdeauna yaml.safe_load() pentru a preveni executarea neintenționată a codului malițios. În mod similar, când folosești YAML în aplicații, asigură validare strictă a schemei pentru a evita vulnerabilitățile de securitate.
Poate YAML să suporte variabile de mediu?
Da! Deși YAML în sine nu procesează direct variabile de mediu, multe instrumente (precum Docker Compose și Kubernetes) permit referențierea variabilelor de mediu în fișiere YAML.
Cum gestionezi comentariile în YAML?
YAML acceptă comentarii pe o singură linie folosind simbolul #, dar nu acceptă comentarii pe mai multe linii. Dacă ai nevoie de comentarii pe mai multe linii, un artificiu des întâlnit este să folosești o cheie fictivă precum _comment. Totuși, aceasta este doar o convenție și nu va fi ignorată de parser-ele YAML, decât dacă aplicația ta o filtrează explicit.