YAML

YAML Ain't Markup Language, định dạng tuần tự hóa dữ liệu dễ đọc dựa trên thụt lề.

YAML (YAML Ain't Markup Language) là định dạng tuần tự hóa dữ liệu dễ đọc sử dụng thụt lề để biểu diễn cấu trúc phân cấp. Ban đầu là viết tắt của "Yet Another Markup Language", nó được đổi tên thành viết tắt đệ quy hiện tại để nhấn mạnh rằng nó không phải là ngôn ngữ đánh dấu. Được sử dụng rộng rãi cho tệp cấu hình và trao đổi dữ liệu, nó là tiêu chuẩn thực tế đặc biệt trong lĩnh vực DevOps.

YAML được thiết kế như tập cha của JSON, nghĩa là tất cả JSON hợp lệ đều là YAML hợp lệ. Các tính năng không có trong JSON bao gồm chú thích (#), anchor và alias (tái sử dụng dữ liệu), nhiều tài liệu trong một tệp (phân tách bằng ---), và block scalar (biểu diễn văn bản nhiều dòng). Nó được áp dụng rộng rãi cho tệp cấu hình trong Docker Compose, Kubernetes manifest, GitHub Actions workflow, Ansible playbook, CloudFormation template và các công cụ DevOps khác.

Cú pháp YAML có một số cạm bẫy đáng chú ý. Ký tự tab không được phép cho thụt lề; chỉ cho phép dấu cách. Chuyển đổi kiểu ngầm định có thể gây ra hành vi không mong muốn: yes, no, on, off được tự động chuyển thành boolean, và 1.0 thành số dấu phẩy động. "Vấn đề Na Uy" khi mã quốc gia NO bị chuyển thành false là ví dụ nổi tiếng. Chuỗi phải được đặt trong dấu ngoặc kép để đảm bảo chúng được xử lý như chuỗi.

Chọn giữa YAML và JSON phụ thuộc vào trường hợp sử dụng. YAML phù hợp cho tệp cấu hình dễ đọc cho con người, với hỗ trợ chú thích là lợi thế lớn. JSON phù hợp cho trao đổi dữ liệu lập trình, với triển khai parser đơn giản hơn và xử lý nhanh hơn. Thực hành phổ biến là JSON cho phản hồi API và YAML cho cấu hình CI/CD.

Từ góc độ bảo mật, deserialization YAML cần thận trọng. Một số parser YAML có thể khởi tạo đối tượng tùy ý, và tải YAML từ nguồn không đáng tin cậy với parser không an toàn có thể dẫn đến lỗ hổng thực thi mã từ xa. Trong PyYAML của Python, nên sử dụng yaml.safe_load() thay vì yaml.load().

Đối với đếm ký tự, YAML có xu hướng ít ký tự hơn JSON cho cùng dữ liệu do ít dấu ngoặc và dấu ngoặc kép hơn. Tuy nhiên, dấu cách thụt lề được tính vào số ký tự, vì vậy cấu trúc lồng sâu có thể dẫn đến nhiều ký tự hơn trong YAML. Khi tối ưu hóa kích thước tệp cấu hình, cần xem xét mối quan hệ giữa độ sâu cấu trúc dữ liệu và số ký tự YAML/JSON.

Chia sẻ bài viết này