Ansible指南:71k星无Agent自动化运维,playbook替代23条手工命令

项目: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有 AgentRuby DSL,灵活但复杂
SaltStackAgent + 消息总线并发极高,适合上千节点

规模判断标准很简单:几十到几百台,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 环境都就绪。

第一个 playbook:安装并配置 Nginx

- 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 管的是「服务器上装什么、配什么」。以下几件事它并不擅长:

我的实践组合是:Ansible 负责机器初始化与中间件部署,Kubernetes 负责应用调度,Prometheus 负责运行态监控。三者边界清晰,各司其职。

常见问题

Ansible 需要被管理端装 Python 吗?

绝大多数模块需要远端有 Python 3 环境,主流 Linux 发行版默认自带。如果目标是网络设备或极简系统,可用 raw 模块或开启 Windows 的 WinRM 支持。

100 台以上会不会很慢?

默认并发数是 5,需要调高 ansible.cfg 中的 forks(如 50),并开启 SSH pipelining 复用连接。开启 fact 缓存也能明显减少每次采集系统信息的开销。

playbook 和 role 有什么区别?

playbook 是任务入口文件,role 是可复用的任务集合(含 tasks、templates、files、defaults 等目录)。多个项目重复用同一套部署逻辑时应抽成 role,避免复制粘贴。