要高效使用 YAML 做运维,核心不是“会写语法”,而是把 YAML 当成运维工程的一部分:结构化、可复用、可校验、可自动化。下面从理念 → 实践 → 工具 → 避坑系统讲。
在运维中,YAML 通常承担这些角色:
| 场景 | 典型用途 |
|---|---|
| 配置管理 | Ansible、SaltStack |
| 基础设施即代码 | Kubernetes、Terraform |
| 应用配置 | Docker Compose、Helm |
| CI/CD | GitLab CI、GitHub Actions |
| 自动化脚本 | 变量、参数、模板 |
✅ YAML 本质是“声明式数据描述语言”
❌ 不要把它当编程语言用
不要一上来就写 YAML
✅ 推荐流程:
需求 → 数据结构设计 → YAML Schema → 实例文件
例如 Ansible 变量:
# schema(文档)
app:
name: string
port: integer
replicas: integer
❌ 不推荐:
# all-in-one.yaml(几百行)
✅ 推荐结构:
inventory/
group_vars/
all.yaml
prod.yaml
dev.yaml
✅ 好处:
❌ 不高效:
image: nginx:1.25.2
✅ 高效:
image: "{{ nginx_image }}"
nginx_image: nginx:1.25.2
✅ 适用于:
- name: 创建配置
template:
src: app.conf.j2
dest: /etc/app/app.conf
port = {{ app_port }}
env = {{ env }}
image: "{{ .Values.image }}"
不要在服务器上才发现问题
✅ 推荐工具:
| 场景 | 工具 |
|---|---|
| Kubernetes | kubeval / kubectl --dry-run |
| Ansible | ansible-lint |
| 通用 YAML | yamllint |
| JSON Schema | yq + schema |
示例:
yamllint site.yaml
kubectl apply -f app.yaml --dry-run=client
✅ 建议单文件职责:
❌ 反例:
k8s-all-in-one.yaml (500 行)
playbook/
site.yaml
roles/
nginx/
tasks/main.yaml
vars/main.yaml
templates/
变量统一管理:
# group_vars/all.yaml
app:
port: 8080
❌ 不建议手写大量 YAML
✅ 推荐方式:
yq eval '.spec.replicas = 3' deploy.yaml
✅ 把 YAML 放到 Git 中:
✅ 这是最高效的运维方式
script: |
echo "start"
echo "done"
defaults: &defaults
timeout: 30
service:
<<: *defaults
⚠ Kubernetes 不推荐
yq eval '.image = "nginx:1.26"' pod.yaml
比 sed/awk 安全 10 倍。
| 坑 | 正确做法 |
|---|---|
| Tab 缩进 | 永远用空格 |
| true/false 被解析 | 加引号 "true" |
| 数字变字符串 | "8080" |
| 顺序敏感 | 善用注释 |
| 超大 YAML | 拆分 |
1. 设计结构(变量、环境)
2. 写 YAML(小文件、单一职责)
3. Git 提交
4. CI 自动校验(yamllint / ansible-lint)
5. PR 审核
6. 自动部署
你可以直接说:
我可以给你针对你场景的最优 YAML 结构模板。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。