Ansible自动化运维:从入门到精通 - 详解

一、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: 80port: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.yml
roles/nginx/tasks/main.yml
声明式任务、变量、handlerSREWorks 自动化编排底座
Kubernetes定义 Pod/Service/Deployment 等资源deployment.yaml
service.yaml
声明式 API、Label/Selector飞天 ACK 集群标准交付格式
Docker Compose定义多容器应用docker-compose.yml服务依赖、网络、卷映射内部开发环境快速启停
Prometheus配置监控目标与告警规则prometheus.yml
alert-rules.yml
scrape_configsrule_files鹰眼监控底层配置
GitLab CI / Jenkins Pipeline定义 CI/CD 流水线.gitlab-ci.yml
Jenkinsfile(部分 YAML)
stagesjobsartifacts代码提交自动触发 Ansible
Helm (K8s 包管理)定义 Chart 模板与默认值values.yaml
templates/deployment.yaml
模板渲染、版本管理内部中间件一键部署
OpenTelemetry Collector配置遥测数据采集otel-collector.yamlreceivers / 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 yamlbash<br>kubectl create deploy demo --image=nginx --dry-run=client -o yaml > demo.yaml需 kubectl ≥ v1.18;旧版可手写基础模板新人培训标准起点
kustomizebash<br>kustomize create --resources=deploy.yaml && kustomize build无需模板引擎,靠 overlay 覆盖差异化配置飞天 ACK 多环境交付标准
helm templatebash<br>helm create myapp && helm template myapp支持变量、条件、循环,适合复杂中间件OceanBase、RocketMQ 等统一用 Helm 封装

 注:kubectx / kubens 不生成 YAML,仅用于切换集群上下文(context)和命名空间(namespace),确保操作环境正确。


2. Ansible Playbook / Role 生成
工具命令示例用途
ansible-galaxy initbash<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

③ 推荐工作流(行动建议)

# 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

总结:YAML 是 DevOps 的“通用语言”,掌握其规则、工具链与安全规范,是构建可靠自动化体系的基础。
记住:不是写 YAML,而是声明“系统应有的样子”。

传送门:Ansible安装https://blog.csdn.net/m0_66705547/article/details/153786846

posted @ 2025-11-22 17:10  yangykaifa  阅读(81)  评论(0)    收藏  举报