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ờ sự đơ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 cá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 sạch sẽ dựa trên thụt dòng của nó loại bỏ sự rườm rà như ở XML mà vẫn linh hoạt.
Trong hướng dẫn này, tôi sẽ đưa bạn đi 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à đị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, tương tự từ điển trong Python, YAML cô đọng hơn và dùng thụt dòng để xác định cấu trúc, khiến nó thân thiện với con người hơn.
YAML hỗ trợ nhiều kiểu dữ liệu, bao gồm vô hướng (chuỗi, số, boolean), dãy (danh sách) và ánh xạ (cặp khóa-giá trị). Nó được sử dụng rộng rãi trong các 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à một 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:
- Thụt dòng bằng khoảng trắng biểu thị cấu trúc, vì vậy hãy tránh dùng tab!
- Cặp khóa-giá trị theo cấu trúc
key: value, tương tự các ngôn ngữ khác. - Dùng dấu gạch ngang ở đầu dòng để 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ự từ điển trong Python. Điều này thường dùng để truyền thông tin cho các tệp cấu hình và thiết lập khác nhau. Không cần đặt chuỗi hoặc khóa trong dấu ngoặc kép; chỉ cần viết khóa và 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, chúng thường được hiển thị bằng ký hiệ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 phân cấp bằng cách thụt dòng. Hãy nghĩ về chúng như các từ điển lồng nhau. Bằng cách dùng thụt dòng, 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à anchors 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 đó với ví dụ thực tế.
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 khi có nhiều lần 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.
- Đối với
|(khối literal):
This is a
multi-line string.
- Đối 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 biết 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 đây 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 sử dụng cho dữ liệu có cấu trúc, nó hỗ trợ:
- Danh sách (dãy):
fruits:
- Apple
- Banana
- Cherry
- Từ điển (ánh xạ):
person:
name: Alice
age: 30
is_student: false
Anchor và alias
YAML cho phép bạn định nghĩa các giá trị có thể 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 dư thừa trong tệp cấu hình, giúp 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 ánh xạ khác. Nếu một khóa tồn tại ở cả hai, 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 đã được giải quyết cuối cùng:
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 sử 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 ưa thích cho tệp cấu hình, tuần tự hóa dữ liệu và Hạ tầng như Mã (IaC). Hãy cùng khám phá các ứng dụng phổ biến nhất.
Tệp cấu hình
YAML được dùng rộng rãi để cấu hình trong các ứng dụng như Docker Compose, Kubernetes và các pipeline CI/CD. Nhờ dễ hiểu, bất kỳ ai cũng có thể nhanh chóng nắm bắt các tệp thiết lập YAML của Docker và hiểu chuyện gì đ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 và hỗ trợ anchor cùng 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ô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 thành định dạng dễ đọc với con người và dễ được máy phân tích.
Ví dụ, phần thân một 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 dòng của YAML loại bỏ cú pháp không cần thiết, giúp nó gọn nhẹ, dễ đọc và dễ chỉnh sửa hơn so với JSON.
Hạ tầng như 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 trên 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 các manifest 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 container hóa.
Dưới đây là ví dụ về cấu hình một 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 sử dụng trong Kubernetes trong khóa học Giới thiệu về Kubernetes này.
Tài liệu API
Các đặ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ề một đặ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
Chẳng hạn, đặc tả OpenAPI dùng YAML để viết tài liệu cho 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 giữa cá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ì nó dựa vào thụt dòng nên 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.
Hãy tưởng tượng bạn có tệp YAML cấu hình sau:
database:
host: localhost
port: 5432
user: admin
password: secret
Cách bạn có thể làm việc với tệp cấu hình của mì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 việc làm việc với dữ liệu JSON trong Python, hãy xem bài hướng dẫn toàn diện về Python JSON.
Xác thực tệp YAML
Để đảm bảo cấu trúc đúng, bạn có thể dùng các công cụ để kiểm tra những lỗi như dùng tab thay vì khoảng trắng hoặc các vấn đề 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 xác thực YAML phổ biến:
- Công cụ CLI: yamllint (trình linter dựa trên Python)
- Trình xác thực trực tuyến: YAML Lint, YAML Validator của JSON Formatter
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ụ linter 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 (kèm plugin YAML)
- PyCharm (hỗ trợ sẵn)
- Sublime Text (kèm tô sáng cú pháp YAML)
Những lỗi 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 các lỗi đó và cung cấp thực hành tốt nhất để viết tệp sạch và chính xác. Đây cũng là lý do tôi khuyên dùng linter 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 dòng—không bao giờ trộn khoảng trắng và tab. Tab sẽ khiến script YAML của bạn bị lỗi. Đây thực ra là một quyết định có chủ đích, vì các hệ thống khác nhau đọc tab khác nhau, do đó để giảm tác động, khoảng trắng là lựa chọn ưu tiên.
Thụt dòng không đúng
Đảm bảo thụt dòng nhất quán để tránh lỗi phân tích. Vì thụt dòng là cách duy nhất của YAML để biểu thị phân cấp, việc phân tích sai có thể gây vấn đề cho mã của bạn. Bạn có thể vô tình đặt một cặp key: value vào sai chỗ, vì vậy hãy chú ý kỹ đến thụt dòng!
Quên đặt ngoặc kép cho ký tự đặc biệt
Hãy 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 sử dụng xác thực phù hợp, chỉnh sửa có cấu trúc và PyYAML của Python, bạn có thể làm việc hiệu quả với các tệp YAML đồng thời tránh được những 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à 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 quan tâm đến việc á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 for 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 Introduction to APIs in 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ó mang tính phổ quát không?
Miễn là nguồn dữ liệu hoặc đích đến có thể đọc YAML, đây là một phương thức hữu ích và khả thi để tuần tự hóa và truyền dữ liệu. Hãy đảm bảo rằng bạn đang gửi dữ liệu tới một đí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 ý được 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ó! Mặ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 các 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 bạn cần chú thích nhiều dòng, một cách làm phổ biến là 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.
