1.1 什么是 Ansible
Ansible 是一个开源的自动化平台,用于配置管理、应用部署、任务执行和编排。它由 Red Hat 公司维护,是目前最受欢迎的 IT 自动化工具之一。
1.1.1 Ansible 的特点
- 无代理架构(Agentless):不需要在目标主机上安装任何代理软件
- 基于 SSH:使用标准的 SSH 协议进行通信
- 声明式语言:使用 YAML 语法描述期望的系统状态
- 幂等性:多次执行相同操作产生相同结果
- 简单易学:语法简洁,学习曲线平缓
- 强大的模块库:提供数千个内置模块
1.1.2 Ansible 的优势
# 示例:简单的 Ansible 任务
- name: 确保 nginx 服务正在运行
service:
name: nginx
state: started
enabled: yes
优势对比:
特性 | Ansible | Puppet | Chef | SaltStack |
---|---|---|---|---|
无代理 | ✓ | ✗ | ✗ | ✗ |
学习难度 | 低 | 高 | 高 | 中 |
配置语言 | YAML | Ruby DSL | Ruby | YAML/Python |
推送模式 | ✓ | ✗ | ✗ | ✓ |
社区支持 | 强 | 强 | 中 | 中 |
1.2 Ansible 架构
1.2.1 核心组件
┌─────────────────────────────────────────────────────────────┐
│ Ansible 架构图 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────┐ ┌─────────────────┐ │
│ │ Control Node │ │ Managed Node │ │
│ │ │ │ │ │
│ │ ┌───────────┐ │ │ ┌───────────┐ │ │
│ │ │ Ansible │ │ │ │ SSH │ │ │
│ │ │ Engine │ │────┼──│ Daemon │ │ │
│ │ └───────────┘ │ │ └───────────┘ │ │
│ │ │ │ │ │
│ │ ┌───────────┐ │ │ ┌───────────┐ │ │
│ │ │Inventory │ │ │ │ Python │ │ │
│ │ └───────────┘ │ │ └───────────┘ │ │
│ │ │ │ │ │
│ │ ┌───────────┐ │ └─────────────────┘ │
│ │ │Playbooks │ │ │
│ │ └───────────┘ │ ┌─────────────────┐ │
│ │ │ │ Managed Node │ │
│ │ ┌───────────┐ │ │ │ │
│ │ │ Modules │ │ │ ┌───────────┐ │ │
│ │ └───────────┘ │ │ │ SSH │ │ │
│ └─────────────────┘ │ │ Daemon │ │ │
│ │ └───────────┘ │ │
│ │ │ │
│ │ ┌───────────┐ │ │
│ │ │ Python │ │ │
│ │ └───────────┘ │ │
│ └─────────────────┘ │
└─────────────────────────────────────────────────────────────┘
1.2.2 控制节点(Control Node)
控制节点是运行 Ansible 的机器,负责:
- 执行 Playbook:解析和执行自动化脚本
- 管理 Inventory:维护主机清单
- 模块分发:将模块推送到目标主机
- 结果收集:收集执行结果并生成报告
# 控制节点要求
# - Python 2.7 或 Python 3.5+
# - SSH 客户端
# - 支持的操作系统:Linux、macOS、WSL
# 检查控制节点环境
python3 --version
ssh -V
ansible --version
1.2.3 被管理节点(Managed Node)
被管理节点是 Ansible 管理的目标主机,要求:
- SSH 服务:用于接收 Ansible 连接
- Python 解释器:执行 Ansible 模块
- 适当权限:执行管理任务的权限
# 被管理节点要求
# - SSH 服务运行
# - Python 2.6+ 或 Python 3.5+
# - sudo 权限(可选)
# 检查被管理节点环境
sudo systemctl status ssh
python3 --version
sudo -l
1.3 Ansible 工作原理
1.3.1 执行流程
sequenceDiagram
participant User as 用户
participant Control as 控制节点
participant Managed as 被管理节点
User->>Control: 执行 ansible-playbook
Control->>Control: 解析 Playbook
Control->>Control: 读取 Inventory
Control->>Managed: SSH 连接
Control->>Managed: 传输模块代码
Managed->>Managed: 执行模块
Managed->>Control: 返回执行结果
Control->>Control: 清理临时文件
Control->>User: 显示执行结果
1.3.2 详细执行步骤
解析阶段 “`yaml
Ansible 解析 Playbook 和 Inventory
- hosts: webservers
tasks:
- name: 安装 nginx
yum:
name: nginx
state: present
2. **连接阶段**
bash # Ansible 通过 SSH 连接到目标主机 ssh user@target-host “`
- name: 安装 nginx
yum:
name: nginx
state: present
- hosts: webservers
tasks:
模块传输阶段
# Ansible 将模块代码传输到目标主机 # 临时目录:/tmp/.ansible-${USER}/tmp/
执行阶段
# 在目标主机上执行模块 python3 /tmp/.ansible-user/tmp/AnsiballZ_yum.py
结果收集阶段
{ "changed": true, "msg": "Package nginx installed successfully", "rc": 0 }
1.4 Ansible 核心概念
1.4.1 Inventory(主机清单)
# /etc/ansible/hosts [webservers] web1.example.com web2.example.com [databases] db1.example.com db2.example.com [production:children] webservers databases
1.4.2 Modules(模块)
# 常用模块示例
- name: 文件操作
file:
path: /etc/nginx/nginx.conf
state: file
mode: '0644'
- name: 包管理
yum:
name: nginx
state: latest
- name: 服务管理
service:
name: nginx
state: started
enabled: yes
1.4.3 Playbooks(剧本)
---
- name: 配置 Web 服务器
hosts: webservers
become: yes
vars:
nginx_port: 80
document_root: /var/www/html
tasks:
- name: 安装 nginx
yum:
name: nginx
state: present
- name: 启动 nginx 服务
service:
name: nginx
state: started
enabled: yes
- name: 配置防火墙
firewalld:
port: "{{ nginx_port }}/tcp"
permanent: yes
state: enabled
immediate: yes
1.4.4 Roles(角色)
roles/
├── nginx/
│ ├── tasks/
│ │ └── main.yml
│ ├── handlers/
│ │ └── main.yml
│ ├── templates/
│ │ └── nginx.conf.j2
│ ├── files/
│ ├── vars/
│ │ └── main.yml
│ ├── defaults/
│ │ └── main.yml
│ └── meta/
│ └── main.yml
1.5 Ansible 生态系统
1.5.1 Ansible 工具集
# 核心命令行工具
ansible # 执行临时命令
ansible-playbook # 执行 Playbook
ansible-vault # 加密敏感数据
ansible-galaxy # 管理角色和集合
ansible-config # 配置管理
ansible-doc # 查看文档
ansible-inventory # 查看主机清单
1.5.2 Ansible Collections
# requirements.yml
collections:
- name: community.general
version: ">=1.0.0"
- name: ansible.posix
- name: community.docker
# 安装集合
ansible-galaxy collection install -r requirements.yml
1.5.3 Ansible Galaxy
# 搜索角色
ansible-galaxy search nginx
# 安装角色
ansible-galaxy install geerlingguy.nginx
# 列出已安装角色
ansible-galaxy list
1.6 使用场景
1.6.1 配置管理
# 系统配置标准化
- name: 配置系统参数
hosts: all
tasks:
- name: 设置时区
timezone:
name: Asia/Shanghai
- name: 配置 NTP
template:
src: ntp.conf.j2
dest: /etc/ntp.conf
notify: restart ntp
1.6.2 应用部署
# 应用自动化部署
- name: 部署 Web 应用
hosts: webservers
tasks:
- name: 下载应用代码
git:
repo: https://github.com/example/webapp.git
dest: /var/www/webapp
version: "{{ app_version }}"
- name: 安装依赖
pip:
requirements: /var/www/webapp/requirements.txt
virtualenv: /var/www/webapp/venv
1.6.3 基础设施编排
# 多层应用部署
- name: 部署三层架构应用
hosts: localhost
tasks:
- name: 配置负载均衡器
include_role:
name: nginx-lb
- name: 配置应用服务器
include_role:
name: app-server
- name: 配置数据库
include_role:
name: mysql-cluster
1.7 与其他工具的集成
1.7.1 CI/CD 集成
# Jenkins Pipeline 示例
pipeline {
agent any
stages {
stage('Deploy') {
steps {
ansiblePlaybook(
playbook: 'deploy.yml',
inventory: 'production',
credentialsId: 'ansible-ssh-key'
)
}
}
}
}
1.7.2 云平台集成
# AWS 资源管理
- name: 创建 EC2 实例
ec2:
key_name: my-key
instance_type: t2.micro
image: ami-12345678
wait: yes
group: webserver
count: 3
vpc_subnet_id: subnet-12345678
assign_public_ip: yes
1.7.3 容器化集成
# Docker 容器管理
- name: 运行 Docker 容器
docker_container:
name: webapp
image: nginx:latest
ports:
- "80:80"
volumes:
- /var/www:/usr/share/nginx/html
state: started
restart_policy: always
1.8 最佳实践预览
1.8.1 目录结构
ansible-project/
├── inventories/
│ ├── production/
│ │ ├── hosts
│ │ └── group_vars/
│ └── staging/
│ ├── hosts
│ └── group_vars/
├── roles/
├── playbooks/
├── group_vars/
├── host_vars/
├── ansible.cfg
└── requirements.yml
1.8.2 安全考虑
# 使用 Ansible Vault 加密敏感数据
- name: 配置数据库连接
template:
src: database.conf.j2
dest: /etc/app/database.conf
vars:
db_password: "{{ vault_db_password }}"
1.8.3 性能优化
# ansible.cfg
[defaults]
host_key_checking = False
pipelining = True
forks = 20
gathering = smart
fact_caching = memory
1.9 学习路径建议
1.9.1 初学者路径
- 基础概念:理解 Ansible 架构和核心概念
- 环境搭建:安装和配置 Ansible 环境
- 简单任务:使用 ad-hoc 命令执行简单任务
- Playbook 入门:编写第一个 Playbook
- 模块学习:掌握常用模块的使用
1.9.2 进阶路径
- 角色开发:创建可重用的角色
- 变量管理:掌握复杂的变量使用
- 模板引擎:使用 Jinja2 模板
- 错误处理:实现健壮的错误处理
- 性能优化:优化 Playbook 执行性能
1.9.3 专家路径
- 自定义模块:开发自定义模块
- 插件开发:创建自定义插件
- 企业集成:与企业系统集成
- 大规模部署:管理大规模基础设施
- 社区贡献:参与开源社区
1.10 本章总结
本章介绍了 Ansible 的基本概念、架构设计和核心组件。主要要点包括:
- Ansible 特点:无代理、基于 SSH、声明式、幂等性
- 架构组件:控制节点、被管理节点、模块、Playbook
- 工作原理:解析、连接、传输、执行、收集结果
- 核心概念:Inventory、Modules、Playbooks、Roles
- 应用场景:配置管理、应用部署、基础设施编排
1.11 练习题
基础练习
概念理解
- 解释 Ansible 无代理架构的优势
- 描述 Ansible 的执行流程
- 比较 Ansible 与其他配置管理工具的差异
架构分析
- 画出 Ansible 的架构图
- 说明控制节点和被管理节点的职责
- 解释模块在 Ansible 中的作用
思考题
场景分析
- 在什么情况下选择 Ansible 而不是其他自动化工具?
- 如何设计一个大型企业的 Ansible 架构?
- Ansible 在云原生环境中的应用场景有哪些?
最佳实践
- 如何确保 Ansible Playbook 的幂等性?
- 在生产环境中使用 Ansible 需要注意哪些安全问题?
- 如何优化 Ansible 的执行性能?
下一章:第2章:安装与环境配置
返回目录:Ansible 自动化运维教程