自动化运维工具——ansible详解(一)
一、 核心概念与架构
1.1 什么是 Ansible?
Ansible 是一款基于 Python 开发的开源自动化运维工具,它集成了众多同类工具(如 Puppet, Chef, Fabric)的优点,能够实现批量系统配置、批量程序部署、批量运行命令等功能。
核心特性:
- 无代理架构:基于 SSH 协议与远程主机通信,无需在目标主机上安装任何客户端(Agent)。
- 模块化设计:功能由模块实现,Ansible 本身提供执行框架。
- 简单易用:使用 YAML 语言编写 Playbook,学习曲线平缓。
- 功能强大:拥有大量内置模块,覆盖日常运维的绝大部分场景。
- 被红帽收购:已成为自动化运维领域的事实标准之一。
1.2 Ansible 架构

| 组件 | 说明 |
|---|---|
| Ansible Core | 核心引擎,负责解析 Playbook、调用模块、管理任务流。 |
| Inventory | 主机清单,定义 Ansible 需要管理的主机及其分组信息。 |
| Playbooks | “剧本”,YAML 格式文件,用于定义复杂、可重复的自动化任务序列。 |
| Core Modules | 核心模块,Ansible 自带的模块库,是执行具体操作(如文件管理、包管理)的单元。 |
| Custom Modules | 自定义模块,用户可用 Python 等语言编写,扩展 Ansible 功能。 |
| Connection Plugins | 连接插件,默认使用 SSH,也支持 WinRM、Docker 等其他连接方式。 |
1.3 任务执行模式
- Ad-Hoc 模式(临时命令):使用
ansible命令行工具执行单条命令或单个模块,适合快速、一次性的任务。1
2ansible all -m ping
ansible web_servers -m shell -a 'uptime' - Playbook 模式(剧本):使用
ansible-playbook执行 YAML 格式的 Playbook 文件,用于定义复杂的、可版本控制的自动化流程,是 Ansible 的主要使用方式。
二、 安装与基础配置
2.1 安装 Ansible
方式一:YUM 安装(推荐用于 RHEL/CentOS)
1 | # 1. 安装 EPEL 仓库 |
方式二:PIP 安装(适用于任何支持 Python 的系统)
1 | # 1. 安装 pip |
安装后目录结构(YUM安装):
- 配置文件目录:
/etc/ansible/ - 执行文件目录:
/usr/bin/ - 模块库目录:
/usr/lib/pythonX.X/site-packages/ansible/
2.2 配置文件 (ansible.cfg)
Ansible 按以下顺序查找配置文件(后者覆盖前者):
- 环境变量
ANSIBLE_CONFIG指定的文件。 - 当前目录下的
./ansible.cfg。 - 用户家目录下的
~/.ansible.cfg。 - 系统默认的
/etc/ansible/ansible.cfg。
常见配置项(/etc/ansible/ansible.cfg):
1 | [defaults] |
2.3 主机清单 (inventory)
主机清单文件(默认为 /etc/ansible/hosts)定义了被管理的主机,支持分组和变量定义。
基本语法:
1 | # 1. 直接定义主机(IP 或主机名) |
2.4 配置 SSH 免密登录
为了执行流畅,建议配置控制节点到所有被管节点的 SSH 密钥认证。
1 | # 1. 在控制节点生成密钥(如果尚未生成) |
三、 命令行工具与 Ad-Hoc 模式
3.1 Ansible 核心命令集
| 命令 | 用途 |
|---|---|
ansible |
执行 Ad-Hoc 命令的核心工具。 |
ansible-doc |
查看模块文档和帮助信息。 |
ansible-playbook |
执行 Playbook 剧本。 |
ansible-vault |
加密/解密敏感数据文件。 |
ansible-galaxy |
从 Galaxy 社区下载/管理 Roles。 |
ansible-console |
交互式命令行界面。 |
ansible-pull |
拉取模式(较少使用)。 |
3.2 ansible 命令详解
基本语法:ansible <主机模式> -m <模块名> -a "<模块参数>" [选项]
常用选项:
| 选项 | 说明 |
|---|---|
-i INVENTORY |
指定自定义的主机清单文件。 |
-m MODULE |
指定要执行的模块(默认为 command)。 |
-a ARGS |
传递给模块的参数。 |
-u REMOTE_USER |
指定远程连接用户。 |
-k |
提示输入 SSH 密码。 |
-K |
提示输入 sudo 密码。 |
-b, --become |
提权执行(通常用 sudo)。 |
--become-user USER |
提权到指定用户。 |
-f FORKS |
并行执行的任务数(默认5)。 |
-v, -vv, -vvv |
输出更详细的执行信息。 |
示例:
1 | # 测试所有主机的连通性 |
3.3 ansible-doc 命令
用于查询模块的详细用法。
1 | # 列出所有可用模块 |
3.4 Ansible 执行流程(Ad-Hoc)
- 加载配置(
ansible.cfg)。 - 解析主机清单(
inventory),确定目标主机。 - 加载指定模块。
- 生成临时 Python 脚本,并通过 SFTP/SCP 传输到目标主机的
~/.ansible/tmp/目录。 - 在目标主机上执行该脚本。
- 返回执行结果,并删除临时脚本。
四、 常用核心模块详解
4.1 连接测试模块:ping
用于测试与目标主机的连通性及 Ansible 环境是否正常。
1 | ansible all -m ping |
返回 pong 即表示成功。
4.2 命令执行模块:command & shell
command模块:执行简单的命令,不支持管道|、重定向>、环境变量$HOME等 Shell 特性。是默认模块。1
ansible web -m command -a "ls -l /var/www"
shell模块:通过/bin/sh执行命令,支持所有 Shell 特性。1
ansible web -m shell -a "ps aux | grep nginx"
常用参数:
chdir:在执行命令前,先切换到此目录。creates:如果此路径的文件存在,则不执行命令。removes:如果此路径的文件不存在,则不执行命令。
4.3 文件管理模块:copy
将本地文件复制到远程主机。
1 | ansible web -m copy -a "src=/etc/nginx/nginx.conf dest=/etc/nginx/nginx.conf owner=root group=root mode=0644" |
常用参数:
src:本地源文件路径(可以是目录)。dest:远程目标路径(必须是绝对路径)。owner/group/mode:设置文件属主、属组和权限。backup=yes:覆盖前备份原文件。content:直接用字符串内容创建文件,替代src。
4.4 文件属性模块:file
管理文件、目录、链接的属性。
1 | # 创建目录 |
state 参数:
directory:创建目录。touch:创建空文件或更新时间戳。link/hard:创建软/硬链接。absent:删除。
4.5 包管理模块:yum (RHEL/CentOS)
管理软件包。
1 | # 安装最新版 |
state 参数:
present或installed:确保安装。latest:确保安装最新版。absent或removed:确保卸载。
4.6 服务管理模块:service
管理系统服务。
1 | # 启动服务并设置开机自启 |
4.7 用户管理模块:user
管理系统用户。
1 | # 创建用户 |
4.8 计划任务模块:cron
管理 Cron 任务。
1 | # 添加计划任务 |
4.9 信息收集模块:setup
收集目标主机的详细信息(Facts),这些信息可以作为变量在 Playbook 中使用。
1 | # 收集所有信息 |
4.10 其他实用模块
- **
fetch**:从远程主机拉取文件到控制节点。 - **
script**:在远程主机上执行控制节点本地的脚本。 - **
group**:管理系统用户组。 - **
get_url**:从 HTTP/FTP 下载文件。 - **
unarchive**:解压文件。
五、 总结与后续
本文涵盖了 Ansible 的基础知识、安装配置、Ad-Hoc 命令以及最常用的核心模块。掌握这些内容是使用 Ansible 进行自动化运维的第一步。
核心要点回顾:
- 无代理、基于 SSH 是 Ansible 的基石。
- Inventory 定义了“对谁操作”。
- 模块 定义了“执行什么操作”。
- Ad-Hoc 用于快速执行单次任务。
- Playbook 是用于复杂、可重复任务的强大工具(将在后续文章中详述)。
下一步学习建议:
- 深入 Playbook:学习 YAML 语法、任务结构、变量、循环、条件判断等。
- 理解 Roles:用于组织和复用 Playbook 的最佳实践。
- 使用 Ansible Vault:加密管理密码等敏感数据。
- 探索 Ansible Galaxy:从社区获取现成的 Roles。
- 学习高级特性:如动态 Inventory、回调插件、自定义模块等。
通过结合 Ad-Hoc 命令的灵活性和 Playbook 的强大编排能力,Ansible 能够帮助您高效、可靠地管理从几台到上万台服务器的运维工作。