第一章:Ansible 简介
了解 Ansible 的发展历程、核心特性、架构原理和使用场景。
最后更新: 2024-01-15
页面目录
Ansible 简介
Ansible 是一个开源的自动化平台,用于配置管理、应用部署、任务自动化和 IT 编排。它以其简洁性、易用性和强大的功能而广受欢迎。
什么是 Ansible?
Ansible 是一个 IT 自动化工具,可以通过 SSH 协议实现对服务器的配置管理、应用部署、任务执行等功能,无需在被管理节点上安装代理程序。
核心特性
| 特性 | 说明 |
|---|---|
| 无代理架构 | 通过 SSH 协议管理节点,无需在被管理主机安装额外软件 |
| YAML 语法 | 使用人类可读的 YAML 格式编写配置和任务 |
| 幂等性 | 重复执行不会改变系统状态,确保安全可靠 |
| 模块化设计 | 内置丰富的模块,支持自定义扩展 |
| 推送模式 | 控制节点主动推送配置到目标主机 |
| 并行执行 | 支持多主机并行操作,提高效率 |
Ansible 的发展历史
| 年份 | 版本 | 主要特性 |
|---|---|---|
| 2012 | Ansible 诞生 | 由 Michael DeHaan 开发 |
| 2013 | Ansible 1.0 | 模块支持、Playbook |
| 2015 | Ansible 2.0 | 重构引擎、Block 语法 |
| 2017 | Ansible 2.4 | 动态 Inventory、配置文件改进 |
| 2019 | Ansible 2.9 | Collections、模块增强 |
| 2020 | Ansible Core 2.10 | 拆分 AWX/Collection |
| 2021+ | Ansible Core 2.11+ | 持续改进、性能优化 |
Ansible vs 其他自动化工具
| 对比项 | Ansible | Puppet | Chef | SaltStack |
|---|---|---|---|---|
| 架构 | 无代理/SSH | 有代理 | 有代理 | 有代理/无代理 |
| 配置语言 | YAML | Ruby DSL | Ruby DSL | YAML/Python |
| 学习曲线 | 低 | 中 | 中 | 中 |
| 可扩展性 | 高 | 高 | 高 | 高 |
| 社区活跃度 | 高 | 高 | 中 | 中 |
| 速度 | 中 | 慢 | 慢 | 快 |
| Windows 支持 | 好 | 一般 | 一般 | 好 |
Ansible 核心概念
┌─────────────────────────────────────────────────────────────────┐
│ Ansible 核心概念 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Inventory │ ───► │ Module │ ───► │ Target │ │
│ │ 主机清单 │ │ 模块 │ │ 目标主机 │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │ │ │
│ ▼ ▼ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Playbook │ │ Handler │ │ Role │ │
│ │ 剧本 │ │ 处理器 │ │ 角色 │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
核心组件说明
| 组件 | 说明 |
|---|---|
| Inventory | 主机清单,定义要管理的主机及其分组 |
| Module | 模块,执行具体任务的功能单元 |
| Playbook | 剧本,定义自动化任务的 YAML 文件 |
| Handler | 处理器,任务执行后触发的回调操作 |
| Role | 角色,组织 Playbook 的目录结构 |
| Fact | 事实,主机收集的系统信息 |
| Vault | 保险库,用于加密敏感数据 |
Ansible 架构原理
┌─────────────────────────────────────────────────────────────────┐
│ Ansible 架构 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ Ansible Engine │ │
│ │ ┌────────────┐ ┌────────────┐ ┌────────────────────┐ │ │
│ │ │ Ansible │ │ Host │ │ Module │ │ │
│ │ │ CLI/Tower│ │ Inventory │ │ System │ │ │
│ │ └─────┬──────┘ └─────┬──────┘ └─────────┬──────────┘ │ │
│ │ │ │ │ │ │
│ │ │ ▼ ▼ │ │
│ │ │ ┌───────────────────────────────┐ │ │
│ │ │ │ Playbook │ │ │
│ │ │ │ (YAML / Python) │ │ │
│ │ │ └───────────────────────────────┘ │ │
│ │ │ │ │ │
│ │ │ ▼ │ │
│ │ │ ┌─────────────────┐ │ │
│ │ └─────────────►│ Execution │ │ │
│ │ │ Plugins │ │ │
│ │ └────────┬────────┘ │ │
│ └─────────────────────────────────│─────────────────────────┘ │
│ │ SSH / WinRM │
│ ┌─────────────────────────────────┼─────────────────────────┐ │
│ │ ▼ │ │
│ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │
│ │ │ Managed │ │ Managed │ │ Managed │ │ │
│ │ │ Host 1 │ │ Host 2 │ │ Host N │ │ │
│ │ │ (Linux) │ │ (Linux) │ │ (Windows) │ │ │
│ │ └──────────────┘ └──────────────┘ └──────────────┘ │ │
│ └───────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
Ansible 工作流程
┌─────────────────────────────────────────────────────────────────┐
│ Ansible 工作流程 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 1. 读取 Inventory → 定义主机和分组 │
│ ↓ │
│ 2. 读取 Playbook → 定义自动化任务 │
│ ↓ │
│ 3. 执行预处理 → 收集 Facts、加载变量 │
│ ↓ │
│ 4. 执行任务 → 调用模块完成具体操作 │
│ ↓ │
│ 5. 执行后处理 → 运行 Handlers │
│ ↓ │
│ 6. 生成报告 → 任务执行结果 │
│ │
└─────────────────────────────────────────────────────────────────┘
使用场景
1. 配置管理
# 安装和配置 Nginx
- name: Configure Nginx
hosts: webservers
tasks:
- name: Install Nginx
apt:
name: nginx
state: present
- name: Start Nginx
service:
name: nginx
state: started
2. 应用部署
# 部署 Web 应用
- name: Deploy Application
hosts: appservers
tasks:
- name: Pull latest code
git:
repo: "https://github.com/example/app.git"
dest: /opt/app
- name: Restart application
systemd:
name: myapp
state: restarted
3. 批量操作
# 在所有主机上执行命令
ansible all -m command -a "uptime"
# 在指定组执行操作
ansible webservers -m copy -a "src=./config.conf dest=/etc/myapp/"
4. 定时任务管理
# 管理 Cron 任务
- name: Manage cron jobs
hosts: all
tasks:
- name: Add cron job
cron:
name: "Backup database"
minute: "0"
hour: "2"
job: "/usr/local/bin/backup.sh"
为什么选择 Ansible?
优势
- ✅ 简单易学:使用 YAML 语法,人类可读
- ✅ 无代理架构:无需在被管理主机安装软件
- ✅ 幂等性:安全可靠,可重复执行
- ✅ 功能强大:内置 3000+ 模块
- ✅ 社区活跃:丰富的 Galaxy 角色和 Collections
- ✅ 跨平台:支持 Linux、Windows、网络设备
适用场景
| 场景 | 推荐使用 |
|---|---|
| 配置管理 | 操作系统、软件安装、网络配置 |
| 应用部署 | Web 应用、微服务、容器编排 |
| 批量操作 | 批量执行命令、文件分发 |
| 任务编排 | 复杂工作流、多阶段部署 |
| 基础设施即代码 | 环境标准化、版本控制 |
常用术语表
| 术语 | 说明 |
|---|---|
| Control Node | Ansible 控制节点,执行 Ansible 的主机 |
| Managed Node | 被管理节点,Ansible 管理的主机 |
| Inventory | 主机清单,定义管理的主机 |
| Playbook | 剧本,定义自动化任务的 YAML 文件 |
| Task | 任务,Playbook 中的最小执行单元 |
| Module | 模块,执行具体功能 |
| Role | 角色,组织 Playbook 的结构 |
| Handler | 处理器,条件触发执行的任务 |
| Fact | 事实,收集的主机信息 |
| Vault | 保险库,加密敏感数据 |
下一步
接下来让我们学习如何安装和配置 Ansible。
👉 安装与配置