Ansible 简介 #
什么是 Ansible? #
Ansible 是一个开源的 IT 自动化平台,用于配置管理、应用部署、任务编排和云服务管理。它由 Michael DeHaan 于 2012 年创建,2015 年被 Red Hat 收购。Ansible 的设计理念是简单、强大、无代理,让自动化变得触手可及。
核心定位 #
text
┌─────────────────────────────────────────────────────────────┐
│ Ansible │
├─────────────────────────────────────────────────────────────┤
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 配置管理 │ │ 应用部署 │ │ 任务编排 │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 云服务管理 │ │ 安全合规 │ │ 持续交付 │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
└─────────────────────────────────────────────────────────────┘
Ansible 的历史 #
发展历程 #
text
2012年 ─── Ansible 项目启动
│
│ Michael DeHaan 创建
│ 灵感来自 Func 和 Puppet
│
2013年 ─── AnsibleWorks 公司成立
│
│ 商业化运营
│ 企业级支持
│
2015年 ─── Red Hat 收购
│
│ 成为企业级标准
│ 集成到 Red Hat 生态
│
2017年 ─── Ansible Tower 集成
│
│ 可视化管理界面
│ RBAC 权限控制
│
2020年 ─── Ansible Automation Platform
│
│ 统一自动化平台
│ 内容集合
│
至今 ─── 行业标准
│
│ 超过 5000+ 模块
│ 活跃的社区贡献
里程碑版本 #
| 版本 | 时间 | 重要特性 |
|---|---|---|
| 1.0 | 2012 | 首次发布,基础功能 |
| 1.2 | 2013 | 引入 Roles 概念 |
| 1.7 | 2014 | Windows 支持 |
| 2.0 | 2015 | 新执行引擎、Blocks |
| 2.2 | 2016 | 动态 Inventory 改进 |
| 2.5 | 2018 | 新 API、模块增强 |
| 2.9 | 2019 | 稳定性增强 |
| 2.10 | 2020 | 集合机制引入 |
| 2.14 | 2022 | 性能优化 |
为什么选择 Ansible? #
传统运维的痛点 #
在没有 Ansible 之前,IT 运维面临以下问题:
bash
# 手动登录每台服务器
ssh user@server1
ssh user@server2
ssh user@server3
# 重复执行相同命令
sudo apt update
sudo apt install nginx
sudo systemctl start nginx
# 配置文件手动修改
vim /etc/nginx/nginx.conf
# 难以追踪变更
# 容易出错
# 不可重复
Ansible 的解决方案 #
yaml
# site.yml
- hosts: webservers
become: yes
tasks:
- name: Install Nginx
apt:
name: nginx
state: present
update_cache: yes
- name: Start Nginx
service:
name: nginx
state: started
enabled: yes
- name: Copy configuration
template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
notify: Restart Nginx
handlers:
- name: Restart Nginx
service:
name: nginx
state: restarted
Ansible 的核心特点 #
1. 无代理架构 #
Ansible 不需要在被管理节点上安装任何代理软件:
text
┌─────────────────────────────────────────────────────────────┐
│ 控制节点 (Control Node) │
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Ansible │ │ Inventory │ │ Playbooks │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
└─────────────────────────────────────────────────────────────┘
│
SSH / WinRM
│
┌─────────────────┼─────────────────┐
│ │ │
▼ ▼ ▼
┌─────────┐ ┌─────────┐ ┌─────────┐
│ Node 1 │ │ Node 2 │ │ Node 3 │
│ (SSH) │ │ (SSH) │ │ (WinRM) │
└─────────┘ └─────────┘ └─────────┘
无需代理 无需代理 无需代理
2. 幂等性 #
多次执行结果一致,不会产生副作用:
yaml
# 第一次执行:创建文件
# 第二次执行:文件已存在,不做任何操作
# 第三次执行:文件已存在,不做任何操作
- name: Create a file
copy:
content: "Hello Ansible"
dest: /tmp/hello.txt
3. 简单易学 #
使用 YAML 语法,人类可读:
yaml
# 非常直观的语法
- name: Install packages
apt:
name:
- nginx
- mysql-server
- php
state: present
4. 声明式配置 #
描述期望状态,而非操作步骤:
yaml
# 声明式:描述期望状态
- name: Ensure Nginx is running
service:
name: nginx
state: started
enabled: yes
# Ansible 会自动判断:
# - 如果服务未启动,则启动
# - 如果服务已启动,则不做任何操作
# - 如果服务未设置开机启动,则设置
5. 模块化设计 #
丰富的内置模块,覆盖各种场景:
text
┌─────────────────────────────────────────────────────────────┐
│ Ansible 模块 │
├─────────────────────────────────────────────────────────────┤
│ 系统模块 │ 文件模块 │ 包管理模块 │ 云模块 │
│ ─────────────│ ─────────────│ ─────────────│ ─────────│
│ command │ copy │ apt │ aws_ec2 │
│ shell │ template │ yum │ azure_rm │
│ service │ file │ dnf │ gcp │
│ user │ lineinfile │ pacman │ docker │
│ group │ synchronize │ pip │ k8s │
└─────────────────────────────────────────────────────────────┘
Ansible 与其他工具对比 #
Ansible vs Puppet #
| 特性 | Ansible | Puppet |
|---|---|---|
| 架构 | 无代理 | C/S 架构 |
| 语言 | YAML | Puppet DSL |
| 学习曲线 | 简单 | 较陡 |
| 配置推送 | 推送模式 | 拉取模式 |
| 实时执行 | 支持 | 需配置 |
Ansible vs Chef #
| 特性 | Ansible | Chef |
|---|---|---|
| 架构 | 无代理 | C/S 架构 |
| 语言 | YAML | Ruby |
| 学习曲线 | 简单 | 较陡 |
| 配置方式 | Playbook | Cookbook |
| 实时执行 | 支持 | 需配置 |
Ansible vs SaltStack #
| 特性 | Ansible | SaltStack |
|---|---|---|
| 架构 | 无代理 | 可选代理 |
| 语言 | YAML | YAML + Python |
| 扩展性 | 中等 | 高 |
| 性能 | 中等 | 高 |
| 学习曲线 | 简单 | 中等 |
Ansible 的应用场景 #
1. 配置管理 #
统一管理服务器配置:
yaml
- hosts: all
become: yes
tasks:
- name: Configure sysctl
sysctl:
name: "{{ item.name }}"
value: "{{ item.value }}"
state: present
loop:
- { name: 'net.core.somaxconn', value: '65535' }
- { name: 'vm.swappiness', value: '10' }
2. 应用部署 #
自动化部署应用程序:
yaml
- hosts: app_servers
become: yes
tasks:
- name: Deploy application
git:
repo: https://github.com/example/app.git
dest: /var/www/app
version: main
- name: Install dependencies
command: npm install
args:
chdir: /var/www/app
- name: Restart application
systemd:
name: app
state: restarted
3. 持续交付 #
集成到 CI/CD 流程:
yaml
# .gitlab-ci.yml
deploy:
stage: deploy
script:
- ansible-playbook -i inventory deploy.yml
only:
- main
4. 云服务管理 #
管理云资源:
yaml
- name: Create EC2 instance
amazon.aws.ec2_instance:
name: "web-server"
key_name: "my-key"
instance_type: "t3.micro"
image_id: "ami-12345678"
region: "us-east-1"
state: present
5. 安全合规 #
执行安全基线检查:
yaml
- hosts: all
become: yes
tasks:
- name: Ensure SSH is configured securely
lineinfile:
path: /etc/ssh/sshd_config
regexp: "{{ item.regexp }}"
line: "{{ item.line }}"
loop:
- { regexp: '^PermitRootLogin', line: 'PermitRootLogin no' }
- { regexp: '^PasswordAuthentication', line: 'PasswordAuthentication no' }
Ansible 的核心概念 #
控制节点 #
运行 Ansible 的机器:
text
控制节点
├── Ansible 安装
├── Inventory 文件
├── Playbook 文件
├── 模块
└── 插件
被管理节点 #
被 Ansible 管理的目标机器:
text
被管理节点
├── Linux 服务器
├── Windows 服务器
├── 网络设备
├── 云服务
└── 容器
模块 #
执行具体任务的代码单元:
yaml
- name: Use copy module
copy:
src: file.txt
dest: /tmp/file.txt
- name: Use apt module
apt:
name: nginx
state: present
任务 #
模块调用的最小单位:
yaml
tasks:
- name: This is a task
module_name:
parameter: value
Playbook #
包含多个 Play 的 YAML 文件:
yaml
- name: First Play
hosts: webservers
tasks:
- name: Task 1
...
- name: Second Play
hosts: databases
tasks:
- name: Task 2
...
Ansible 的工作原理 #
执行流程 #
text
┌─────────────────────────────────────────────────────────────┐
│ 1. 读取 Inventory │
│ └── 获取目标主机列表 │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 2. 解析 Playbook │
│ └── 读取任务定义 │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 3. 收集 Facts │
│ └── 获取目标主机信息 │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 4. 生成 Python 脚本 │
│ └── 将任务转换为可执行代码 │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 5. SSH 传输并执行 │
│ └── 在目标主机上执行 │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 6. 返回执行结果 │
│ └── 收集输出并报告 │
└─────────────────────────────────────────────────────────────┘
通信方式 #
text
Linux/Unix Windows
│ │
▼ ▼
SSH WinRM
│ │
└─────────┬─────────┘
│
▼
目标主机执行
│
▼
返回结果
Ansible 的局限性 #
已知限制 #
- Windows 控制节点:不支持在 Windows 上运行控制节点
- 大规模部署:默认串行执行,大规模场景需优化
- 实时性:推送模式,非实时监控
- 状态存储:无内置状态数据库
解决方案 #
yaml
# 使用策略插件提高并发
- hosts: all
strategy: free
tasks:
- name: Parallel execution
...
# 使用异步任务
- hosts: all
tasks:
- name: Long running task
command: /opt/long_task.sh
async: 3600
poll: 0
学习路径 #
text
入门阶段
├── 安装配置
├── 基础概念
├── 清单管理
└── Ad-hoc 命令
进阶阶段
├── Playbook 编写
├── 变量管理
├── 模板使用
└── 常用模块
高级阶段
├── Roles 角色
├── Ansible Vault
├── 自定义模块
└── 性能优化
实战阶段
├── 应用部署
├── 云服务管理
├── CI/CD 集成
└── 最佳实践
下一步 #
现在你已经了解了 Ansible 的基本概念,接下来学习 安装与配置 开始实际使用 Ansible!
最后更新:2026-03-29