一、ansible介紹
Ansible是一個開源軟件,提供配置管理和應用程序部署等項目通用的管理功能。它主要運行在類Unix系統上,通過特性語言來描述各種資源對象,進而管理類Unix系統和Microsoft Windows系統等系統資源。
它是由Michael DeHaan基於Python語言編寫而成,2012年發佈第一個版本,並於2015年10月被Red Hat收購,目前的最新版本是2.18.6。它與其他同類的自動化管理工具的不同在於,Ansible是無代理的(即採用的是"拉模式")-通過SSH協議的方式來完成工作。
1.ansible的工作原理
- 控制節點(裝有 Ansible 的機器)通過 SSH(Linux)或 WinRM(Windows) 與被管理節點通信,默認無需安裝代理,靠系統自帶的 Python 和 SSH 服務執行指令;
- 三大核心要素包括:Inventory(定義被管理節點清單)、Playbook(以 YAML 編寫的自動化任務編排腳本)和 Modules(執行具體操作的功能單元)。控制節點調用模塊,通過通信協議將任務推送到被管理節點並返回執行結果,實現無代理的自動化運維。
2.主機清單的核心作用
- 定義被管主機列表:IP、域名、別名,一個不能少;
- 按業務角色分組:比如
web、db、cache,不同組執行不同 Playbook; - 綁定變量:比如
web組用 Nginx,db組要調大vm.dirty_ratio,直接在清單裏寫,不用改 Playbook; - 支持動態擴展:對接 CMDB(開源用 Nacos/Consul),機器自動上下線,Ansible 自動感知。
如何分組管理
靜態清單示例(inventory.ini)
# 定義單個主機(可帶別名和連接參數)
jumpserver ansible_host=10.0.0.1 ansible_user=ops
# 分組:前端 Web 服務器
[prod_web]
web01 ansible_host=10.0.1.10
web02 ansible_host=10.0.1.11
web03 ansible_host=10.0.1.12
# 分組:MySQL 主從
[prod_db]
db-master ansible_host=10.0.2.10
db-slave1 ansible_host=10.0.2.11
db-slave2 ansible_host=10.0.2.12
# 組變量:所有 Web 服務器共用配置
[prod_web:vars]
ansible_user=webuser
nginx_worker_processes=8
kernel_tcp_tw_reuse=1
# 組變量:DB 專用調優
[prod_db:vars]
ansible_user=dba
vm_swappiness=1
innodb_buffer_pool_size=12G
# 嵌套組:把 web 和 db 合併成全站組(用於全局操作)
[prod_all:children]
prod_web
prod_db
3.命令與playbook對比
核心區別一句話:
Ad-hoc 是“一次性操作”,Playbook 是“工業化交付”。
|
對比項
|
Ad-hoc 命令
|
Playbook
|
|
形式
|
命令行一行搞定
|
YAML 文件,結構化任務流
|
|
冪等性
|
難保證(尤其用 |
天然支持(模塊設計+狀態檢查)
|
|
可複用
|
無法版本管理
|
Git 管控,團隊共享
|
|
錯誤處理
|
簡單,失敗就停
|
支持 |
|
回滾能力
|
無
|
可配 |
|
變量/邏輯
|
極弱
|
支持變量、循環、條件判斷、模板渲染
|
二、YAML 文件:現代 DevOps 的通用數據契約語言
YAML 不是“配置文件語法”,而是現代 DevOps 的通用數據契約語言。
從 Ansible Playbook 到 Kubernetes 資源定義,再到 SREWorks 編排任務,YAML 是傳遞“系統應該長什麼樣”的核心載體。
1. YAML 核心規則
YAML(YAML Ain’t Markup Language)是一種結構化數據序列化格式,比 JSON 更易讀,比 XML 更簡潔。
必須掌握的 5 條鐵律
|
規則
|
正確示例
|
錯誤示例
|
後果
|
|
1. 縮進代表層級(必須用空格,禁用 Tab) |
|
使用 Tab 縮進
|
Ansible 直接報錯
|
|
2. 冒號後必須跟空格 |
|
|
解析失敗
|
|
3. 列表用 |
|
|
被當作字符串
|
|
4. 字符串可不加引號(但含特殊字符必須加) |
|
|
被拆成多個 token
|
|
5. 多行文本用 `
|
|
|
用 |
2. 常用軟件 YAML 文件用途對照表(阿里生產級)
|
軟件 / 平台
|
YAML 文件典型用途
|
文件示例名
|
關鍵特點
|
阿里等效實踐
|
|
Ansible |
定義自動化任務流
|
|
聲明式任務、變量、handler
|
SREWorks 自動化編排底座
|
|
Kubernetes |
定義 Pod/Service/Deployment 等資源
|
|
聲明式 API、Label/Selector
|
飛天 ACK 集羣標準交付格式
|
|
Docker Compose |
定義多容器應用
|
|
服務依賴、網絡、卷映射
|
內部開發環境快速啓停
|
|
Prometheus |
配置監控目標與告警規則
|
|
|
鷹眼監控底層配置
|
|
GitLab CI / Jenkins Pipeline |
定義 CI/CD 流水線
|
|
|
代碼提交自動觸發 Ansible
|
|
Helm (K8s 包管理) |
定義 Chart 模板與默認值
|
|
模板渲染、版本管理
|
內部中間件一鍵部署
|
|
OpenTelemetry Collector |
配置遙測數據採集
|
|
|
全鏈路追蹤數據接入
|
|
Terraform(HCL 兼容 YAML) |
聲明雲資源(較少用,但支持)
|
|
|
混合雲資源編排
|
關鍵:
- Ansible 和 Kubernetes 是 YAML 重度用户:一個管“機器狀態”,一個管“應用狀態”。
- 所有 YAML 文件的共同點:描述“期望狀態”(Desired State),而非“如何到達”。
- 阿里內部規範:所有 YAML 必須通過 Schema 校驗(如
kubeval、ansible-lint),否則禁止合入。
3. YAML 高級技巧
① 錨點(Anchor)與引用(Alias)——避免重複
defaults: &defaults
timeout: 30
retries: 3
web:
<<: *defaults # 繼承 defaults
port: 80
db:
<<: *defaults
port: 3306
② 多文檔分隔(---)——一個文件多個資源
# k8s-deploy.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
---
apiVersion: v1
kind: Service
metadata:
name: web-svc
③ 變量插值(Jinja2 in Ansible)
# Ansible Playbook 中
tasks:
- name: Set max connections
lineinfile:
path: /etc/myapp.conf
line: "max_conn = {{ ansible_processor_vcpus * 100 }}"
④ 使用 yamllint 校驗格式
# 安裝
pip install yamllint
# 創建含 Tab 的 test.yaml,運行校驗
yamllint test.yaml # 會報縮進錯誤
# 驗證多 Play 文件是否合法
# 把 Playbook 用 --- 分成兩個 Play,仍可正常執行
4. YAML 文件書寫最佳實踐
① 按場景分類的 YAML 生成工具
1. Kubernetes 資源生成
|
工具
|
命令示例
|
説明
|
阿里實踐
|
|
|
|
需 kubectl ≥ v1.18;舊版可手寫基礎模板
|
新人培訓標準起點
|
|
|
|
無需模板引擎,靠 overlay 覆蓋差異化配置
|
飛天 ACK 多環境交付標準
|
|
|
|
支持變量、條件、循環,適合複雜中間件
|
OceanBase、RocketMQ 等統一用 Helm 封裝
|
注:
kubectx/kubens不生成 YAML,僅用於切換集羣上下文(context)和命名空間(namespace),確保操作環境正確。
2. Ansible Playbook / Role 生成
|
工具
|
命令示例
|
用途
|
|
|
|
自動生成標準 Role 目錄結構(含 tasks/handlers/vars)
|
|
VS Code + Ansible 插件
|
安裝官方 "Ansible" 插件
|
實時語法高亮、自動補全、錯誤提示
|
3. 通用 YAML 結構生成(JSON 轉換 / 腳本化)
|
工具
|
命令示例
|
説明
|
|
|
```bash
# JSON 轉 YAML
echo '{"port":80}'
|
yq -o yaml
# 顯式指定格式
echo '{"port":80}'
|
|
Python 腳本
|
|
適合嵌入自動化流水線
|
4. 可視化編輯器(學習 / 脱敏演練)
|
工具
|
説明
|
安全提示
|
|
Killercoda / Monokle
|
交互式 K8s YAML 編輯與驗證
|
僅用於學習或脱敏配置,嚴禁粘貼含 secrets、tokens、內網 IP、數據庫密碼等生產敏感信息! |
|
VS Code + YAML 插件
|
本地編輯,支持 Schema 校驗
|
推薦作為生產環境唯一可視化工具
|
② 禁止行為
- 手動複製粘貼 YAML → 縮進/空格錯誤率超 60%(內部故障統計);
- 用非代碼編輯器寫 YAML(如 Word / 記事本)→ 引入不可見字符;
- 未經校驗提交 YAML → 所有文件必須通過以下校驗:
yamllint *.yaml
kubeval --strict *.yaml # Kubernetes
ansible-lint playbook.yml # Ansible
③ 推薦工作流(行動建議)
# 1. 生成 K8s Deployment(確保 kubectl >= 1.18)
kubectl create deploy demo --image=nginx --dry-run=client -o yaml > demo.yaml
# 2. 生成 Ansible Role
ansible-galaxy init roles/demo
# 3. 安裝並校驗工具
pip install yamllint ansible-lint
yamllint demo.yaml
# 4. JSON 轉 YAML(正確 yq 用法)
echo '{"max_conn":1000}' | yq -o yaml