Tại sao nên ngừng dùng sed hay awk để sửa file YAML?
Nếu bạn làm việc với Kubernetes, Docker Compose hay CI/CD pipeline, YAML là thứ không thể tránh khỏi. Trước đây, mình thường dùng sed hoặc awk để sửa nhanh một giá trị. Tuy nhiên, YAML cực kỳ nhạy cảm với khoảng trắng và thụt đầu dòng. Chỉ cần một lệnh sed thay thế nhầm hoặc làm lệch một dấu cách, toàn bộ hệ thống có thể ngừng hoạt động ngay lập tức.
Mình từng gặp một sự cố trên server production Ubuntu 22.04. Khi đó, mình dùng sed để cập nhật version image cho file Deployment. Do không hiểu cấu trúc lồng nhau, sed đã thay đổi luôn cả các chuỗi ký tự tương tự ở những block không liên quan. Kết quả là hệ thống downtime 15 phút chỉ vì lỗi định dạng. Đó là lý do bạn cần một công cụ hiểu rõ cấu trúc cây của YAML thay vì chỉ coi nó là văn bản thuần túy. yq chính là giải pháp chuẩn xác nhất.
So sánh các cách xử lý file YAML phổ biến
1. Chỉnh sửa thủ công (Vim/Nano)
- Ưu điểm: Trực quan với file ngắn.
- Nhược điểm: Không thể tự động hóa. Khi cần sửa 100 file cùng lúc, cách này hoàn toàn bất khả thi.
2. Dùng sed/awk/grep
- Ưu điểm: Luôn có sẵn trên Linux.
- Nhược điểm: Dễ phá vỡ cấu trúc YAML. Việc viết Regex cho các cấp độ lồng nhau (nested) là một cực hình và rất dễ sai sót.
3. Sử dụng yq
- Ưu điểm: Truy vấn và sửa đổi dựa trên cấu trúc logic. Cú pháp tương tự
jq, giúp bảo vệ định dạng file tuyệt đối. - Nhược điểm: Cần cài đặt thêm, nhưng file binary chỉ nặng khoảng 10-15MB.
Lựa chọn phiên bản yq phù hợp
Hiện có hai phiên bản yq: một bản viết bằng Python và một bản viết bằng Go (của Mike Farah). Trong bài này, mình sử dụng bản của Mike Farah. Đây là phiên bản tiêu chuẩn trong cộng đồng DevOps vì chạy độc lập, không cần cài đặt thêm runtime và có tốc độ xử lý cực nhanh.
Cài đặt yq trong 30 giây
Thay vì dùng repo cũ của hệ điều hành, mình luôn ưu tiên tải trực tiếp bản binary từ GitHub để có tính năng mới nhất:
# Tải bản binary cho kiến trúc x86_64
sudo wget https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64 -O /usr/bin/yq
# Cấp quyền thực thi
sudo chmod +x /usr/bin/yq
# Kiểm tra cài đặt
yq --version
Thực hành các tác vụ thực tế với yq
Hãy lấy file config.yaml dưới đây làm ví dụ thực tế:
app_name: my-web-app
environment: staging
replica_count: 2
services:
- name: frontend
port: 80
- name: backend
port: 8080
database:
host: localhost
user: admin
1. Đọc dữ liệu chính xác
Bạn có thể lấy giá trị của bất kỳ field nào bằng toán tử chấm (.). Cách này cực kỳ hữu ích khi cần gán giá trị vào biến trong shell script.
# Lấy tên ứng dụng
yq '.app_name' config.yaml
# Lấy port của service đầu tiên (index 0)
yq '.services[0].port' config.yaml
2. Cập nhật giá trị không làm hỏng format
Đây là tác vụ quan trọng nhất. Ví dụ, bạn muốn tăng replica_count lên 5 và đổi môi trường sang “production”.
# Xem kết quả thay đổi trước trên màn hình
yq '.replica_count = 5' config.yaml
# Ghi trực tiếp thay đổi vào file bằng flag -i
yq -i '.environment = "production"' config.yaml
3. Thêm và xóa field nhanh chóng
Thêm cấu hình timeout cho database hoặc xóa thông tin nhạy cảm chỉ với một dòng lệnh:
# Thêm field mới
yq -i '.database.timeout = 30' config.yaml
# Xóa field user để bảo mật
yq -i 'del(.database.user)' config.yaml
4. Chuyển đổi YAML sang JSON
Nhiều API chỉ nhận JSON nhưng file cấu hình của bạn lại là YAML. yq xử lý việc này trong tích tắc.
# Xuất định dạng JSON
yq -o=json config.yaml
# Chuyển ngược từ JSON sang YAML đẹp (Pretty print)
yq -P config.json
Mẹo nhỏ từ kinh nghiệm thực tế
Sau nhiều năm quản lý hạ tầng, mình rút ra vài lưu ý để bạn sử dụng yq an toàn hơn:
- Chạy thử trước khi ghi đè: Luôn chạy lệnh không có flag
-iđể kiểm tra output. Khi đã chắc chắn logic đúng, bạn mới áp dụng ghi đè vào file gốc. - Tận dụng Pipe (|):
yqphối hợp rất tốt với các lệnh Linux khác. Bạn có thể dùngcurlđể lấy file cấu hình từ xa rồi đẩy thẳng quayqđể lọc dữ liệu. - Gộp nhiều file cấu hình:
yqhỗ trợ merge các file môi trường (base và override) cực kỳ hiệu quả.
Ví dụ gộp cấu hình chung và cấu hình riêng cho từng môi trường:
yq eval-all '. as $item ireduce ({}; . * $item)' base.yaml override.yaml
Lời kết
Sử dụng yq giúp công việc của SysAdmin chuyên nghiệp và ít rủi ro hơn hẳn. Thay vì vật lộn với những dòng sed phức tạp, hãy để yq xử lý đúng bản chất cấu trúc của dữ liệu. Nếu bạn đang làm hạ tầng dưới dạng code (IaC), đây chắc chắn là công cụ mà bạn nên có sẵn trong bộ đồ nghề của mình.
