项目:ansible/ansible | 星数:71158 | 语言:Python | 协议:GPL-3.0 | GitHub仓库
更新日期:2026-10-30 · 作者:CodeArts 编辑部
接手一个项目时,运维给我一份 Word 文档,上面写着"新机器需执行的 23 条命令"。第一台照着敲完花了四十分钟,第五台开始出错——漏了一条 systemd 重载,或者某台机器上某个包版本不同。后来我把这 23 条命令写成 Ansible playbook,一键分发到全部机器,而且可以重复执行、结果可验证。
Ansible 是 71158 星、GPL-3.0 的配置管理工具,用 Python 写成。它最大的特点是无 Agent:通过 SSH 连接目标机器,不需要在远端安装任何常驻程序,用完即走。
| 工具 | 架构 | 特点 |
|---|---|---|
| Ansible | 无 Agent,SSH 推送 | 上手最快,YAML 描述,适合中小规模 |
| Puppet | 有 Agent + Master | 强一致,适合大规模,学习曲线陡 |
| Chef | 有 Agent | Ruby DSL,灵活但复杂 |
| SaltStack | Agent + 消息总线 | 并发极高,适合上千节点 |
规模判断标准很简单:几十到几百台,Ansible 完全够用;上千台且需要秒级一致性收敛,再考虑 SaltStack。它的弱点是规模大时 SSH 串行连接慢,靠 forks 参数和 SSH 长连接(pipelining)缓解。
pip install ansible # 清单文件 inventory.ini [web] 192.168.1.10 ansible_user=root 192.168.1.11 ansible_user=root # 验证连通性 ansible -i inventory.ini web -m ping # 临时执行一条命令(ad-hoc) ansible -i inventory.ini web -m shell -a "df -h"
-m ping 用的不是系统 ping,而是通过 SSH 执行一个 Python 探测模块——它能通说明 SSH 与远端 Python 环境都就绪。
- name: 部署 Nginx
hosts: web
become: yes
tasks:
- name: 安装 nginx
apt:
name: nginx
state: present
update_cache: yes
- name: 下发站点配置
copy:
src: files/site.conf
dest: /etc/nginx/conf.d/site.conf
notify: reload nginx
- name: 启动并开机自启
service:
name: nginx
state: started
enabled: yes
handlers:
- name: reload nginx
service:
name: nginx
state: reloaded
这里最值得学的是 notify + handlers:只有配置文件发生变化时才触发 reload,没变就跳过。这就是"幂等"——同一份 playbook 跑十次,只有第一次会真正改动。手工执行命令最常犯的错误就是重复启动服务、重复追加配置。
坑一:把 shell 当万能模块。早期我所有任务都用 shell 执行 apt install,结果每次运行都重新装一遍、还报"已是最新版本"。正确做法是用 apt、copy、template 这类专用模块,它们自带幂等判断。
坑二:敏感信息明文写在 playbook。密码直接写进 YAML 提交到 Git,是最常见的安全事故。应该用 ansible-vault 加密变量文件,运行时用 --ask-vault-pass 输入密码。
坑三:主机清单硬编码 IP。机器一批批换,inventory 里全是旧 IP。改用动态清单(从云厂商 API 拉取)或者按角色分组,配合 ansible-inventory --graph 检查分组是否正确。
Ansible 管的是「服务器上装什么、配什么」。以下几件事它并不擅长:
--check 模式来发现问题。我的实践组合是:Ansible 负责机器初始化与中间件部署,Kubernetes 负责应用调度,Prometheus 负责运行态监控。三者边界清晰,各司其职。
绝大多数模块需要远端有 Python 3 环境,主流 Linux 发行版默认自带。如果目标是网络设备或极简系统,可用 raw 模块或开启 Windows 的 WinRM 支持。
默认并发数是 5,需要调高 ansible.cfg 中的 forks(如 50),并开启 SSH pipelining 复用连接。开启 fact 缓存也能明显减少每次采集系统信息的开销。
playbook 是任务入口文件,role 是可复用的任务集合(含 tasks、templates、files、defaults 等目录)。多个项目重复用同一套部署逻辑时应抽成 role,避免复制粘贴。