Tracks
Qua nhiều năm, tôi đã làm việc với vô số tệp cấu hình, và YAML nổi bật nhờ tính đơn giản và dễ đọc. Dù là thiết lập quy trình trong Kubernetes, định nghĩa dịch vụ trong Docker hay cấu trúc yêu cầu API, YAML giúp quản lý các cấu hình phức tạp trở nên dễ dàng hơn. Cấu trúc gọn gàng dựa trên thụt lề của nó loại bỏ sự lộn xộn của các định dạng như XML nhưng vẫn linh hoạt.
Trong hướng dẫn này, tôi sẽ đưa bạn qua cú pháp, cấu trúc, các tính năng nâng cao và thực hành tốt nhất của YAML để bạn có thể làm việc với nó một cách tự tin.
YAML là gì?
YAML (Yet Another Markup Language / YAML Ain’t Markup Language) là một định dạng tuần tự hóa dữ liệu ưu tiên khả năng đọc và dễ sử dụng. Trong khi XML dùng các thẻ lồng nhau giống HTML và JSON dùng ngoặc nhọn cùng dấu ngoặc kép như từ điển Python, YAML ngắn gọn hơn và dùng thụt lề để xác định cấu trúc, thân thiện hơn với con người.
YAML hỗ trợ nhiều kiểu dữ liệu, bao gồm vô hướng (chuỗi, số, boolean), dãy (list) và ánh xạ (cặp khóa–giá trị). Nó được dùng rộng rãi trong tệp cấu hình, tự động hóa hạ tầng và trao đổi dữ liệu, đặc biệt trong các công cụ như Kubernetes, Docker và Ansible.
Ngoài ra, YAML là siêu tập của JSON, nghĩa là các tệp JSON hợp lệ có thể được phân tích như YAML. Tệp YAML thường có phần mở rộng .yaml hoặc .yml.
Bạn cũng có thể tìm hiểu thêm về YAML trên trang web của nó!
Cú pháp và cấu trúc YAML
Phần này sẽ khám phá các nguyên tắc cơ bản của cú pháp YAML, bao gồm cặp khóa–giá trị, danh sách, dữ liệu lồng nhau và chú thích.
Quy tắc cú pháp cơ bản
Có một vài quy tắc cú pháp cơ bản cho YAML:
- Khoảng trắng thụt lề thể hiện cấu trúc, vì vậy hãy tránh dùng tab!
- Các cặp khóa–giá trị theo cấu trúc
key: value, tương tự các ngôn ngữ khác. - Dấu gạch ngang ở đầu dòng sẽ biểu thị một danh sách.
- Dùng
#để tạo dòng chú thích.
# Here is an example of YAML
name: John Doe
age: 30
skills:
- Python
- YAML
Cặp khóa–giá trị
YAML biểu diễn dữ liệu dưới dạng cặp khóa–giá trị, tương tự dictionary trong Python. Điều này thường biểu thị thông tin cung cấp cho các tệp cấu hình và thiết lập khác nhau. Không cần dùng dấu ngoặc kép cho chuỗi hoặc khóa; chỉ cần viết khóa và các giá trị cần thiết:
location: New York
country: USA
security-level: user
Danh sách trong YAML
Danh sách được biểu diễn bằng dấu gạch ngang (-). Điều này cho phép bạn liệt kê nhiều đối tượng dưới một khóa. Khi đọc bằng các trình soạn thảo Markup, điều này thường được hiển thị trực quan dưới dạng dấu đầu dòng.
fruits:
- Apple
- Banana
- Cherry
Dữ liệu lồng nhau
Cấu trúc lồng nhau cho phép biểu diễn dữ liệu dạng phân cấp bằng thụt lề. Hãy nghĩ về chúng như các dictionary lồng nhau. Bằng cách dùng thụt lề, bạn biểu thị khóa nào là tập con của khóa khác.
person:
name: Alice
details:
age: 25
city: London
Chú thích
Chú thích bắt đầu bằng # và bị bộ phân tích YAML bỏ qua. Đây là các chú thích một dòng.
# This is a comment
username: admin
password: secret
Các tính năng nâng cao của YAML
YAML bao gồm những tính năng mạnh mẽ như chuỗi nhiều dòng, kiểu dữ liệu và anchor giúp tài liệu hiệu quả và có cấu trúc hơn. Trong phần này, chúng ta sẽ khám phá các khả năng này với ví dụ thực tiễn.
Chuỗi nhiều dòng
YAML hỗ trợ chuỗi nhiều dòng bằng | (khối literal) hoặc > (khối gấp).
- Khối literal
|sẽ tạo ký tự xuống dòng\ncho mỗi lần ngắt dòng. - Khối gấp
>chỉ tạo dòng mới cho các ngắt dòng liên tiếp.
literal: |
This is a
multi-line string.
folded: >
This is another
multi-line string.
Điều trên sẽ dễ hiểu hơn khi xem đầu ra.
- Với
|(khối literal):
This is a
multi-line string.
- Với
>(khối gấp):
This is another multi-line string.
Kiểu dữ liệu trong YAML
YAML hỗ trợ nhiều kiểu dữ liệu, bao gồm chuỗi, số, boolean và giá trị null. Nó tự động nhận dạng kiểu dựa trên định dạng nhưng cũng cho phép khai báo kiểu tường minh.
Ví dụ sau cho thấy cách dùng các kiểu dữ liệu cơ bản trong 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 cho phép khai báo kiểu tường minh bằng !!type khi cần:
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
Vì YAML thường được dùng cho dữ liệu có cấu trúc, nó hỗ trợ:
- Danh sách (sequence):
fruits:
- Apple
- Banana
- Cherry
- Từ điển (mapping):
person:
name: Alice
age: 30
is_student: false
Anchor và alias
YAML cho phép bạn định nghĩa các giá trị tái sử dụng bằng anchor (&) và tham chiếu lại chúng bằng alias (*). Điều này giúp giảm lặp lại trong tệp cấu hình, khiến chúng gọn gàng và dễ bảo trì hơn.
defaults: &default_settings
retries: 3
timeout: 30
server1:
host: example.com
retries: *default_settings # Reuses the retries value from defaults
Cú pháp <<: cho phép hợp nhất các cặp khóa–giá trị từ một anchor vào một mapping khác. Nếu một khóa tồn tại ở cả hai nơi, giá trị mới sẽ ghi đè giá trị gốc.
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
Đây là cấu trúc sau khi hợp nhất:
server1:
retries: 3
timeout: 30
host: example.com
Anchor và alias đặc biệt hữu ích trong các tệp cấu hình lớn, nơi việc lặp lại giá trị thủ công sẽ kém hiệu quả. Chúng giúp tệp YAML tuân theo nguyên tắc DRY (Don't Repeat Yourself) và dễ cập nhật hơn.
Các trường hợp sử dụng phổ biến của YAML
YAML được dùng rộng rãi trong phát triển phần mềm, tự động hóa hạ tầng và quản lý API. Cú pháp dễ đọc khiến nó trở thành định dạng ưu tiên cho tệp cấu hình, tuần tự hóa dữ liệu và Hạ tầng dưới dạng Mã (IaC). Hãy cùng khám phá những ứng dụng phổ biến nhất.
Tệp cấu hình
YAML được dùng rộng rãi cho cấu hình trong các ứng dụng như Docker Compose, Kubernetes và pipeline CI/CD. Tính dễ hiểu của nó giúp bất kỳ ai cũng có thể tiếp cận các tệp thiết lập YAML của Docker và nắm được nội dung đang diễn ra.
version: '3'
services:
web:
image: nginx
ports:
- "80:80"
environment:
- NGINX_HOST=localhost
- NGINX_PORT=80
Tính dễ đọc của YAML cùng hỗ trợ anchor và alias giúp giảm lặp lại, khiến nó dễ bảo trì hơn JSON hoặc XML.
Tìm hiểu thêm về YAML và cách dùng trong Docker trong khóa học Docker trình độ trung cấp này.
Tuần tự hóa và truyền dữ liệu
YAML được dùng để tuần tự hóa dữ liệu cho API và các công cụ quản lý cấu hình bằng cách chuyển các cấu trúc dữ liệu phức tạp sang định dạng dễ đọc với con người và dễ được máy móc phân tích.
Ví dụ, một phần thân yêu cầu API được định dạng bằng YAML:
user:
id: 123
name: "John Doe"
email: "johndoe@example.com"
active: true
Cấu trúc dựa trên thụt lề của YAML loại bỏ cú pháp dư thừa, khiến nó gọn nhẹ, dễ đọc và dễ chỉnh sửa hơn so với JSON.
Hạ tầng dưới dạng Mã (IaC)
Các công cụ quản lý cấu hình như Ansible và Kubernetes tận dụng YAML để định nghĩa trạng thái hệ thống, tự động hóa quy trình và đảm bảo tính nhất quán giữa các môi trường.
- Trong Ansible, YAML được dùng để viết playbook định nghĩa trạng thái hệ thống, tác vụ và phụ thuộc, đảm bảo các thành phần hạ tầng được cấu hình nhất quán.
- Kubernetes sử dụng bản kê YAML để định nghĩa tài nguyên như pod, service và deployment, cho phép điều phối tự động các ứng dụng dạng container.
Đây là ví dụ về cấu hình Pod trong Kubernetes:
apiVersion: v1
kind: Pod
metadata:
name: my-app
spec:
containers:
- name: app-container
image: my-app:latest
ports:
- containerPort: 8080
Tìm hiểu thêm về cách YAML được dùng trong Kubernetes trong khóa học Nhập môn Kubernetes này.
Tài liệu API
Đặc tả API như OpenAPI và Swagger dùng YAML để định nghĩa endpoint và cấu trúc dữ liệu theo cách dễ đọc. YAML được dùng để phác thảo phương thức API, tham số yêu cầu, định dạng phản hồi và phương thức xác thực.
Ví dụ về đặc tả OpenAPI bằng 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
Ví dụ, OpenAPI dùng YAML để tài liệu hóa RESTful API. Điều này cho phép họ cung cấp bản thiết kế rõ ràng để tạo SDK phía khách, tài liệu API tương tác và kiểm thử tự động. Định dạng có cấu trúc này đảm bảo tính nhất quán trong việc triển khai API.
Làm việc với tệp YAML
YAML được dùng rộng rãi cho tệp cấu hình, tự động hóa và tuần tự hóa dữ liệu, nhưng vì phụ thuộc vào thụt lề, việc định dạng đúng là rất quan trọng. Dưới đây là cách bạn có thể đọc, ghi, xác thực và chỉnh sửa YAML hiệu quả.
Đọc và ghi YAML trong Python
Thư viện PyYAML của Python có thể phân tích và tạo YAML.
Giả sử bạn có tệp YAML cấu hình sau:
database:
host: localhost
port: 5432
user: admin
password: secret
Dưới đây là cách bạn có thể làm việc với tệp cấu hình trong 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)
Nếu bạn quan tâm đến làm việc với dữ liệu JSON trong Python, hãy xem hướng dẫn Python JSON toàn diện.
Xác thực tệp YAML
Để đảm bảo cấu trúc đúng, bạn có thể dùng công cụ để kiểm tra các tab thay vì khoảng trắng hoặc những vấn đề lạ như ký tự lặp, lỗi cú pháp và khoảng trắng thừa ở cuối dòng.
Dưới đây là một số trình kiểm tra YAML phổ biến:
- Công cụ CLI: yamllint (trình lint dựa trên Python)
- Trình kiểm tra trực tuyến: YAML Lint, JSON Formatter’s YAML Validator
Chỉnh sửa YAML
Bạn có thể viết và chỉnh sửa YAML trong bất kỳ trình soạn thảo văn bản nào, nhưng công cụ lint và tô sáng cú pháp sẽ cải thiện khả năng đọc.
Một vài trình soạn thảo tôi ưa thích:
- VS Code (với plugin YAML)
- PyCharm (hỗ trợ tích hợp sẵn)
- Sublime Text (với tô sáng cú pháp YAML)
Những sai lầm thường gặp cần tránh trong YAML
Dù đơn giản, bạn vẫn có thể dễ mắc lỗi và gõ sai khi làm việc với YAML. Phần này thảo luận những lỗi đó và đưa ra thực hành tốt nhất để viết tệp sạch và đúng. Đây cũng là lý do tôi khuyên dùng trình lint hoặc trình soạn thảo văn bản!
Trộn tab và khoảng trắng
YAML dựa vào khoảng trắng để thụt lề—không bao giờ trộn khoảng trắng và tab. Tab sẽ khiến script YAML của bạn hỏng. Đây thực chất là quyết định có chủ đích, vì các hệ thống khác nhau đọc tab khác nhau, do đó để giảm ảnh hưởng, khoảng trắng được ưu tiên sử dụng.
Thụt lề không đúng
Đảm bảo thụt lề nhất quán để tránh lỗi phân tích. Vì thụt lề là phương thức duy nhất của YAML để biểu thị phân cấp, việc phân tích sai có thể gây lỗi cho mã của bạn. Bạn có thể vô tình đẩy một cặp key: value vào sai chỗ, nên hãy chú ý kỹ phần thụt lề!
Quên đặt dấu ngoặc kép cho ký tự đặc biệt
Dùng dấu ngoặc kép cho chuỗi chứa ký tự đặc biệt hoặc khoảng trắng. Những thứ như dấu gạch chéo ngược, dấu phẩy, dấu chấm than, v.v. cần dấu ngoặc để được đọc là chuỗi.
path: "/home/user/documents"
message: "Hello, World!"
Bằng cách xác thực đúng, chỉnh sửa có cấu trúc và dùng PyYAML của Python, bạn có thể làm việc hiệu quả với tệp YAML đồng thời tránh các cạm bẫy thường gặp.
Kết luận
YAML là một định dạng mạnh mẽ nhưng đơn giản, được dùng rộng rãi trong cấu hình, tuần tự hóa dữ liệu và tự động hóa hạ tầng. Bằng cách hiểu cú pháp, cấu trúc và các thực hành tốt nhất, bạn có thể làm việc hiệu quả với YAML trong nhiều ứng dụng.
Nếu bạn muốn áp dụng YAML trong các tình huống thực tế:
- Tìm hiểu cách YAML được dùng trong quy trình CI/CD với khóa học CI/CD cho Machine Learning này.
- Khám phá cách API sử dụng YAML trong đặc tả của chúng trong khóa học Nhập môn API trong Python này.
- Đào sâu hơn vào container hóa và tự động hóa hạ tầng trong lộ trình Containerization and Virtualization này.
Câu hỏi thường gặp
YAML có tính phổ quát không?
Miễn là nguồn hoặc đích dữ liệu có thể đọc YAML, đây là một phương thức khả dụng và hữu ích để tuần tự hóa và vận chuyển dữ liệu. Hãy đảm bảo bạn đang gửi dữ liệu tới đích có thể xử lý YAML.
YAML có an toàn không? Tệp YAML có thể gây rủi ro bảo mật không?
Bản thân YAML chỉ là một định dạng dữ liệu, nhưng rủi ro bảo mật phát sinh khi phân tích các tệp YAML không đáng tin cậy. Phương thức mặc định yaml.load() trong PyYAML của Python có thể thực thi mã tùy ý nhúng trong YAML, gây rủi ro. Thay vào đó, luôn dùng yaml.safe_load() để ngăn việc vô tình thực thi mã độc. Tương tự, khi dùng YAML trong ứng dụng, hãy đảm bảo xác thực schema nghiêm ngặt để tránh lỗ hổng bảo mật.
YAML có hỗ trợ biến môi trường không?
Có! Dù YAML tự nó không trực tiếp xử lý biến môi trường, nhiều công cụ (như Docker Compose và Kubernetes) cho phép tham chiếu biến môi trường trong tệp YAML.
Xử lý chú thích trong YAML như thế nào?
YAML hỗ trợ chú thích một dòng bằng ký hiệu #, nhưng không hỗ trợ chú thích nhiều dòng. Nếu cần chú thích nhiều dòng, một cách làm thường dùng là sử dụng khóa giả như _comment. Tuy nhiên, đây chỉ là quy ước và sẽ không bị bộ phân tích YAML bỏ qua trừ khi ứng dụng của bạn đặc biệt lọc nó.
Tôi là một nhà khoa học dữ liệu có kinh nghiệm về phân tích không gian, học máy và đường ống dữ liệu. Tôi đã làm việc với GCP, Hadoop, Hive, Snowflake, Airflow và các quy trình khoa học/kỹ thuật dữ liệu khác.
