一、Ansible 简介
Ansible 是一款开源的 IT 自动化工具,主要用于配置管理、应用部署、任务编排和批量系统管理。它由 Red Hat 维护,采用 无代理架构(Agentless),即被管理节点无需安装额外软件,仅需 Python 和 SSH 连接即可工作。相比 Puppet、SaltStack 等工具,Ansible 以 简单、易用、幂等性 著称,尤其适合中小规模集群的自动化运维。
1.1 核心特性
• **无代理**:通过 SSH 或 WinRM 连接远程主机,无需在被控端部署客户端。
• **声明式语言**:使用 YAML 编写 Playbook,描述期望状态而非执行步骤。
• **幂等性**:多次执行同一任务结果一致,不会产生副作用。
• **模块化**:内置数百个模块(如 `copy`、`command`、`yum`),可扩展自定义模块。
• **并行执行**:默认并行执行任务,支持 `forks` 参数控制并发数。
二、安装 Ansible
2.1 环境要求
• **控制节点**:Linux/Unix 系统(推荐 CentOS 7+ 或 Ubuntu 18.04+),Python 2.7 或 Python 3.5+。
• **被控节点**:任何支持 SSH 的系统(Linux/Windows/macOS),需安装 Python 2.6+ 或 Python 3.5+。
2.2 安装方式
#### 方式一:EPEL 仓库安装(CentOS/RHEL)
# 启用 EPEL 仓库 sudo yum install epel-release -y # 安装 Ansible sudo yum install ansible -y # 验证安装 ansible --version
#### 方式二:pip 安装(通用)
# 安装 Python3 和 pip(如未安装) sudo yum install python3 python3-pip -y # 使用 pip 安装 Ansible pip3 install ansible # 验证安装 ansible --version
**注意**:pip 安装的版本通常比 EPEL 更新,建议使用 Python 3 环境以避免兼容性问题。
三、核心概念
3.1 Inventory(主机清单)
Inventory 定义了 Ansible 管理的主机列表和分组信息,默认路径为 /etc/ansible/hosts,支持静态文件或动态脚本。
#### 静态 Inventory 示例
# /etc/ansible/hosts [webservers] web1.example.com web2.example.com ansible_user=root ansible_port=2222 [dbservers] db1.example.com db2.example.com [all:vars] ansible_user=admin ansible_ssh_private_key_file=/home/admin/.ssh/id_rsa
• `[webservers]`:定义分组,后续 Playbook 可针对该组执行任务。
• `ansible_user`:连接使用的用户名,可全局定义或单主机指定。
• `ansible_port`:SSH 端口(默认 22)。
3.2 Module(模块)
模块是 Ansible 的任务执行单元,每个模块实现特定功能(如文件操作、包管理、服务控制)。
#### 常用模块速查表
| 模块名称 | 功能描述 | 示例命令 |
| `command` | 在远程主机执行命令(非 shell 特性) | `ansible all -m command -a “uptime”` |
| `shell` | 通过 shell 执行命令(支持管道、通配符) | `ansible all -m shell -a “ps aux \| grep nginx”` |
| `copy` | 复制本地文件到远程主机 | `ansible all -m copy -a “src=/etc/hosts dest=/tmp/hosts”` |
| `file` | 管理文件和目录属性(权限、所有者) | `ansible all -m file -a “path=/tmp/test state=directory mode=0755″` |
| `yum` | 管理 RHEL/CentOS 软件包 | `ansible all -m yum -a “name=httpd state=latest”` |
| `service` | 管理系统服务 | `ansible all -m service -a “name=httpd state=started enabled=yes”` |
| `ping` | 测试主机连通性 | `ansible all -m ping` |
| `setup` | 收集远程主机系统信息(Facts) | `ansible all -m setup -a “filter=ansible_os_family”` |
3.3 Playbook(剧本)
Playbook 是 Ansible 的核心配置语言,使用 YAML 格式编写,定义一组有序的任务(tasks)作用于特定主机组。
#### Playbook 基本结构
---
- name: 部署 Web 服务器
hosts: webservers
become: yes
vars:
http_port: 80
tasks:
- name: 安装 httpd 软件包
yum:
name: httpd
state: present
- name: 复制配置文件
copy:
src: /etc/ansible/httpd.conf.j2
dest: /etc/httpd/conf/httpd.conf
notify: restart httpd
- name: 启动并启用服务
service:
name: httpd
state: started
enabled: yes
handlers:
- name: restart httpd
service:
name: httpd
state: restarted
• `hosts`:指定目标主机组(如 `webservers`)。
• `become`:是否提权(如 `sudo`)。
• `vars`:定义变量,可在任务或模板中引用。
• `tasks`:任务列表,按顺序执行。
• `handlers`:触发器,仅在任务状态变化时执行(如重启服务)。
四、常用 ad-hoc 命令
Ad-hoc 命令是临时执行的任务,适合快速操作,无需编写 Playbook。
4.1 测试连通性
ansible all -m ping
输出示例:
web1.example.com | SUCCESS => {
"changed": false,
"ping": "pong"
}
4.2 批量执行命令
# 查看所有主机 uptime ansible all -m command -a "uptime" # 通过 shell 模块查看进程 ansible webservers -m shell -a "ps aux | grep nginx"
4.3 文件操作
# 复制文件 ansible all -m copy -a "src=/etc/hosts dest=/tmp/hosts owner=root group=root mode=0644" # 创建目录 ansible all -m file -a "path=/var/log/nginx state=directory mode=0755"
4.4 包管理
# 安装 nginx ansible webservers -m yum -a "name=nginx state=present" # 卸载 git ansible all -m yum -a "name=git state=absent"
4.5 服务管理
# 启动并设置开机自启 ansible webservers -m service -a "name=nginx state=started enabled=yes" # 重启服务 ansible webservers -m service -a "name=nginx state=restarted"
五、模块速查表
以下为运维场景中最常用的模块速查表,按功能分类:
| 功能分类 | 模块名称 | 用途 | 常用参数 |
| **系统信息** | `setup` | 收集主机 Facts | `filter=ansible_memtotal_mb` |
| **文件操作** | `copy` | 复制文件 | `src`, `dest`, `owner`, `mode` |
| | `file` | 管理文件/目录属性 | `path`, `state`, `mode`, `owner` |
| | `template` | 模板渲染(Jinja2) | `src`, `dest`, `vars` |
| **包管理** | `yum` / `apt` | 安装/卸载软件包 | `name`, `state=present/absent/latest` |
| **服务管理** | `service` | 管理服务状态 | `name`, `state=started/stopped/restarted`, `enabled` |
| **命令执行** | `command` | 执行命令(非 shell) | `chdir`, `creates`, `removes` |
| | `shell` | 通过 shell 执行 | `chdir`, `executable` |
| **用户管理** | `user` | 管理用户账户 | `name`, `state=present/absent`, `groups`, `shell` |
| **网络调试** | `ping` | 测试连通性 | 无参数 |
| **定时任务** | `cron` | 管理 crontab | `name`, `minute`, `hour`, `job`, `state=present/absent` |
六、进阶提示
6.1 使用 ansible-doc 查看模块文档
# 查看 copy 模块的完整文档 ansible-doc copy # 列出所有可用模块 ansible-doc -l | grep yum
6.2 优化并行执行
# 设置并发数为 10(默认 5) ansible all -m ping --forks=10
6.3 测试 Playbook 语法
# 检查 YAML 语法 ansible-playbook --syntax-check deploy.yml # 模拟执行(dry run) ansible-playbook -C deploy.yml
总结
Ansible 通过简单的 YAML 语法和模块化设计,极大降低了运维自动化的门槛。本文覆盖了从安装、核心概念到实际命令使用的完整流程,建议读者从 ping 模块开始测试环境,逐步尝试 copy、yum、service 等常用模块,最终编写第一个 Playbook 完成实际部署任务。
最佳实践建议:
1. 始终使用 `–syntax-check` 验证 Playbook。
2. 为 Inventory 文件设置合理的分组和变量。
3. 利用 `handlers` 实现服务重启的幂等控制。
4. 通过 `ansible-doc` 深入探索模块参数。
