Xử lý YAML trên Linux: Tại sao yq là công cụ thay thế hoàn hảo cho sed và awk?

Linux tutorial - IT technology blog
Linux tutorial - IT technology blog

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 (|): yq phối hợp rất tốt với các lệnh Linux khác. Bạn có thể dùng curl để lấy file cấu hình từ xa rồi đẩy thẳng qua yq để lọc dữ liệu.
  • Gộp nhiều file cấu hình: yq hỗ 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.

Share: