YAML:沒有雜亂的配置檔案
YAML 已成為 Kubernetes、Docker 和 CI/CD 配置的標準格式。了解 YAML 的基本語法規則、縮排陷阱和常見錯誤,寫出清晰可靠的配置檔案。
每個 Kubernetes manifest。每個 GitHub Actions 工作流程。每個 Docker Compose 檔案。
YAML 在配置中無處不在。它可讀,它靈活,它有一些令人驚訝的怪癖。
為什麼是 YAML?
JSON 很嚴格:雙引號、無註解、無尾隨逗號。
YAML 很寬容:最小語法、允許註解、人類可讀。
# YAML 配置
database:
host: localhost
port: 5432
name: myapp
{
"database": {
"host": "localhost",
"port": 5432,
"name": "myapp"
}
}
相同的資料,YAML 中的雜訊更少。
基礎
鍵值對:
name: John
age: 30
巢狀結構(使用空格,而非 tab):
person:
name: John
age: 30
清單:
colors:
- red
- green
- blue
內聯清單和物件:
colors: [red, green, blue]
person: {name: John, age: 30}
挪威問題
country: NO
NO 是什麼?布林值 false。YAML 將 NO、Yes、on、off 和其他解釋為布林值。
挪威的國家代碼變成 false。你的配置以神秘的方式損壞。
修復: 引用可能被解釋為布林值的字串。
country: "NO"
多行字串問題
description: This is a long
description that continues
這是兩行還是一行,「that continues」縮排?取決於 YAML 解析器。
明確的多行:
# 字面(保留換行)
description: |
Line one
Line two
# 摺疊(連接行)
description: >
This is one long
line when parsed
縮排很重要
兩個空格。不是 tab。不是一個空格。不是三個。
# 正確
parent:
child: value
# 錯誤 - tab 字符
parent:
child: value
混合 tab 和空格會靜默地破壞 YAML。配置你的編輯器使用空格。
數字解釋
version: 1.10
那是字串「1.10」還是數字 1.1?大多數解析器將其解釋為 1.1。
浮點數學再次襲擊。引用版本號。
version: "1.10"
錨點和別名
YAML 可以引用重複的內容:
defaults: &defaults
timeout: 30
retries: 3
production:
<<: *defaults
timeout: 60
對於減少重複很強大。過度使用時令人困惑。
驗證 YAML
YAML 的靈活性意味著許多看起來有效的東西並不有效。
- 在編輯器中使用 linter
- 盡可能針對模式驗證
- 轉換為 JSON 以查看解析器實際解釋的內容
如果你的配置無效,檢查解析器看到的內容,而不是你寫的內容。
YAML vs JSON vs TOML
YAML: 人類可讀,許多功能,怪異的邊緣情況。
JSON: 嚴格,簡單,廣泛支援,冗長。
TOML: 明確,更少的驚喜,在配置中越來越受歡迎。
對於機器到機器的資料,JSON 更安全。對於人類編輯的配置,如果你知道陷阱,YAML 有效。
YAML 優先考慮可讀性而非嚴格性。這種權衡創造了邊緣情況。引用看起來像布林值或數字的字串,使用明確的多行語法,並在部署前驗證。