一、ansible介紹

 Ansible是一個開源軟件,提供配置管理和應用程序部署等項目通用的管理功能。它主要運行在類Unix系統上,通過特性語言來描述各種資源對象,進而管理類Unix系統和Microsoft Windows系統等系統資源。
    它是由Michael DeHaan基於Python語言編寫而成,2012年發佈第一個版本,並於2015年10月被Red Hat收購,目前的最新版本是2.18.6。它與其他同類的自動化管理工具的不同在於,Ansible是無代理的(即採用的是"拉模式")-通過SSH協議的方式來完成工作。

1.ansible的工作原理

  1. 控制節點(裝有 Ansible 的機器)通過 SSH(Linux)或 WinRM(Windows) 與被管理節點通信,默認無需安裝代理,靠系統自帶的 Python 和 SSH 服務執行指令;
  2. 三大核心要素包括:Inventory(定義被管理節點清單)、Playbook(以 YAML 編寫的自動化任務編排腳本)和 Modules(執行具體操作的功能單元)。控制節點調用模塊,通過通信協議將任務推送到被管理節點並返回執行結果,實現無代理的自動化運維。

2.主機清單的核心作用

  1. 定義被管主機列表:IP、域名、別名,一個不能少;
  2. 按業務角色分組:比如 webdbcache,不同組執行不同 Playbook;
  3. 綁定變量:比如 web 組用 Nginx,db 組要調大 vm.dirty_ratio,直接在清單裏寫,不用改 Playbook;
  4. 支持動態擴展:對接 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 文件,結構化任務流

冪等性

難保證(尤其用 shell 模塊)

天然支持(模塊設計+狀態檢查)

可複用

 無法版本管理

 Git 管控,團隊共享

錯誤處理

簡單,失敗就停

支持 ignore_errorsblock/rescue

回滾能力


可配 handlers 或獨立 rollback 任務

變量/邏輯

極弱

支持變量、循環、條件判斷、模板渲染

二、YAML 文件:現代 DevOps 的通用數據契約語言

YAML 不是“配置文件語法”,而是現代 DevOps 的通用數據契約語言
從 Ansible Playbook 到 Kubernetes 資源定義,再到 SREWorks 編排任務,YAML 是傳遞“系統應該長什麼樣”的核心載體。


1. YAML 核心規則

YAML(YAML Ain’t Markup Language)是一種結構化數據序列化格式,比 JSON 更易讀,比 XML 更簡潔。

必須掌握的 5 條鐵律

規則

正確示例

錯誤示例

後果

1. 縮進代表層級(必須用空格,禁用 Tab)

tasks:

- name: test

使用 Tab 縮進

Ansible 直接報錯

2. 冒號後必須跟空格

port: 80

port:80

解析失敗

3. 列表用 -(短橫 + 空格)

- web01

- web02

-web01

被當作字符串

4. 字符串可不加引號(但含特殊字符必須加)

msg: Hello

path: "/tmp/file with space"

path: /tmp/file with space

被拆成多個 token

5. 多行文本用 `

(保留換行)或 >`(摺疊換行)

banner:  Welcome to SRE

用 \n 拼接


2. 常用軟件 YAML 文件用途對照表(阿里生產級)

軟件 / 平台

YAML 文件典型用途

文件示例名

關鍵特點

阿里等效實踐

Ansible

定義自動化任務流

deploy.ymlroles/nginx/tasks/main.yml

聲明式任務、變量、handler

SREWorks 自動化編排底座

Kubernetes

定義 Pod/Service/Deployment 等資源

deployment.yamlservice.yaml

聲明式 API、Label/Selector

飛天 ACK 集羣標準交付格式

Docker Compose

定義多容器應用

docker-compose.yml

服務依賴、網絡、卷映射

內部開發環境快速啓停

Prometheus

配置監控目標與告警規則

prometheus.ymlalert-rules.yml

scrape_configsrule_files

鷹眼監控底層配置

GitLab CI / Jenkins Pipeline

定義 CI/CD 流水線

.gitlab-ci.ymlJenkinsfile(部分 YAML)

stagesjobsartifacts

代碼提交自動觸發 Ansible

Helm (K8s 包管理)

定義 Chart 模板與默認值

values.yamltemplates/deployment.yaml

模板渲染、版本管理

內部中間件一鍵部署

OpenTelemetry Collector

配置遙測數據採集

otel-collector.yaml

receivers / processors / exporters

全鏈路追蹤數據接入

Terraform(HCL 兼容 YAML)

聲明雲資源(較少用,但支持)

main.tf.json(可轉 YAML)

provider / resource

混合雲資源編排

關鍵

  • Ansible 和 Kubernetes 是 YAML 重度用户:一個管“機器狀態”,一個管“應用狀態”。
  • 所有 YAML 文件的共同點:描述“期望狀態”(Desired State),而非“如何到達”。
  • 阿里內部規範:所有 YAML 必須通過 Schema 校驗(如 kubevalansible-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 create deploy --dry-run=client -o yaml

bash<br>kubectl create deploy demo --image=nginx --dry-run=client -o yaml > demo.yaml

需 kubectl ≥ v1.18;舊版可手寫基礎模板

新人培訓標準起點

kustomize

bash<br>kustomize create --resources=deploy.yaml && kustomize build

無需模板引擎,靠 overlay 覆蓋差異化配置

飛天 ACK 多環境交付標準

helm template

bash<br>helm create myapp && helm template myapp

支持變量、條件、循環,適合複雜中間件

OceanBase、RocketMQ 等統一用 Helm 封裝

 注:kubectx / kubens 不生成 YAML,僅用於切換集羣上下文(context)和命名空間(namespace),確保操作環境正確。


2. Ansible Playbook / Role 生成

工具

命令示例

用途

ansible-galaxy init

bash<br>ansible-galaxy init roles/nginx

自動生成標準 Role 目錄結構(含 tasks/handlers/vars)

VS Code + Ansible 插件

安裝官方 "Ansible" 插件

實時語法高亮、自動補全、錯誤提示


3. 通用 YAML 結構生成(JSON 轉換 / 腳本化)

工具

命令示例

説明

yq(v4+)

```bash

# JSON 轉 YAML

echo '{"port":80}'

yq -o yaml


# 顯式指定格式

echo '{"port":80}'

Python 腳本

bash<br>python3 -c "import yaml, sys; print(yaml.dump({'port':80}))"

適合嵌入自動化流水線


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

③ 推薦工作流(行動建議)

自動化運維工具Ansible保姆級攻略,讓你從入門到精通_51CTO博客_bash

# 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