JSON, YAML, .env và Python CLI
Thực hiện trên server của bạn, rồi kiểm tra từng tiêu chí.
JSON, YAML, .env và Python CLI
Mục tiêu
Đọc cấu hình có kiểu dữ liệu rõ ràng và viết CLI trích kết quả từ HTTP.
Hiểu trước khi làm
JSON có object/array/string/number/boolean/null; YAML dùng indentation và có thể hiểu giá trị thành kiểu ngoài ý muốn. Quote version "1.0" và tên có dấu đặc biệt. .env là định dạng theo công cụ đọc, không tự là shell script an toàn. TOML có section và kiểu dữ liệu tường minh. Không source file cấu hình tải từ nguồn không tin cậy.
Chuẩn bị
Hoàn thành các bài cốt lõi trước đó trong module; dùng workspace ~/kdc-labs và ứng dụng mẫu ở project. Chạy agent trên chính máy làm bài, với lab root ~/kdc-labs.
Tải ứng dụng mẫu KDC Notes · Cách tải và chuẩn bị workspace. Không cần mã nguồn nền tảng khóa học.
cd ~/kdc-labs/project
mkdir -p ../evidence
Giải thích lệnh và tham số
cd chuyển vào repo ứng dụng của bạn; .. là thư mục cha ~/kdc-labs. mkdir -p tạo thư mục bằng chứng nếu chưa có, không báo lỗi khi đã tồn tại. Mọi đường dẫn tương đối ở dưới tính từ đây, trừ khi bước ghi rõ máy/thư mục khác.
Thực hành
Tạo settings.json với object {"app":"kdc-notes","port":8081,"debug":false}; dùng lệnh dưới để kiểm tra cú pháp và jq để đọc trường. Tạo settings.yaml tương đương và thử đổi indentation; dùng .venv/bin/python -m pip install PyYAML nếu cần parser YAML trong lab.
python3 -m json.tool settings.json
jq -r .app settings.json
Giải thích lệnh và tham số
-m json.tool parse và pretty-print JSON, exit khác 0 khi sai cú pháp. jq -r xuất string không có dấu quote; .app chọn khóa app.
Tạo health-cli.py bằng thư viện chuẩn:
import argparse
import json
import sys
import urllib.request
parser = argparse.ArgumentParser()
parser.add_argument('--url', default='http://127.0.0.1:8081/healthz')
args = parser.parse_args()
try:
with urllib.request.urlopen(args.url, timeout=5) as response:
payload = json.load(response)
print(json.dumps({'status': payload['status']}, ensure_ascii=False))
sys.exit(0 if payload['status'] == 'ok' else 1)
except (OSError, ValueError, KeyError) as exc:
print(type(exc).__name__, file=sys.stderr)
sys.exit(1)
python3 health-cli.py --url http://127.0.0.1:8081/healthz > ../evidence/cli-health.json
Giải thích lệnh và tham số
--url là tham số do argparse định nghĩa, timeout trong chương trình giới hạn request. Redirect chỉ lưu stdout JSON; lỗi vẫn ở stderr.
Viết thêm hàm đọc JSON từ file bằng context manager with open(...); thử thiếu file, sai JSON, thiếu trường status. Dùng grep tìm dòng, awk chọn cột và sed thay text trên bản sao log trong project, không trên file hệ thống. Ghi vì sao không dùng regex để parse JSON/YAML.
Tiêu chí tệp nộp bài
Các đường dẫn dưới đây tính từ lab root ~/kdc-labs, không từ thư mục project. Không viết sẵn kết quả giả để qua kiểm tra. Tệp có đúng tiêu đề chưa chứng minh đã thực hiện bài; giữ đầu ra thật và tự đối chiếu các phép thử.
project/settings.json— trườngdebugbằngfalse. Xuất từ phép thử/công cụ thật theo hướng dẫn.evidence/cli-health.json— trườngstatusbằng"ok". Xuất từ phép thử/công cụ thật theo hướng dẫn.evidence/data-json-yaml-python.md— có nội dung## Kết quả.
Tự kiểm tra
CLI tốt exit 0 và JSON status ok; URL hỏng/JSON thiếu trường exit khác 0. settings có boolean false thực sự, không string "false".
Kiểm tra trên web xác nhận tệp cấu hình hoặc hồ sơ bài làm dưới lab root; không xác nhận dịch vụ cloud, kết quả CI hay nội dung lập luận. Bạn phải thực hiện các phép thử bên trên và lưu đầu ra thật để tự đối chiếu.
Lưu bằng chứng
Tạo evidence/data-json-yaml-python.md bằng trình soạn thảo, gồm các mục dưới đây. Điền số liệu và lệnh đã chạy, thời điểm, đầu ra trước/sau, cùng kết luận của bạn; không chỉ sao chép tiêu đề. Không lưu token, mật khẩu, kubeconfig hoặc dump dữ liệu vào báo cáo.
## Môi trường
Hệ điều hành, phiên bản công cụ, cluster/VM và thời điểm.
## Kết quả
Lệnh kiểm tra, đầu ra đã che thông tin nhạy cảm, kết quả mong đợi/thực tế.
## Giải thích
Vì sao cách làm đạt mục tiêu; giới hạn của phép kiểm tra.
## Khôi phục
Cách rollback/cleanup riêng các tài nguyên lab và cách xác nhận lại.