为什么需要自动化运维工具

服务器从 3 台涨到 30 台时,最先扛不住的不是磁盘,而是你自己。每加一台机器都要手动装一遍环境、改一遍配置、重启一遍服务;更糟的是三十台机器早就被前人的手工作业改得五花八门,谁也说不清哪台是「标准状态」。

自动化运维工具要解决的就是这件事:把「这台机器应该长什么样」写成代码,让工具去把每台机器收敛到这个样子。Ansible 在同类工具里门槛最低——它不需要在被管机器上装任何客户端,全靠 SSH 连上执行;一台控制机 + 一个 inventory 文件就能开工。

手工运维是把每台机器当成独生子照顾;自动化运维是把所有机器当成同一份配置的多份副本。
本文核心知识点
  • Inventory把机器按业务、环境分组,是一切批量操作的入口。
  • Playbook用 YAML 写「期望状态」,而不是一步步的执行脚本。
  • 幂等同一个 Playbook 跑十遍和跑一遍结果一样,这是它敢反复执行的底气。
  • 无 Agent靠 SSH 推任务,被管机零安装,上手成本极低。
Ansible 自动化运维配图:中央主控节点向一排服务器批量连线推送的蓝色扁平科技插画
控制机一份剧本,SSH 到所有目标机器把状态收敛到位——这就是 Ansible 的工作方式。

Inventory:把机器组织起来

Inventory 就是一张「我管哪些机器」的清单。最简单的写法是一个 ini 或 YAML 文件,把主机按组归类:

# inventory.ini
[web]
10.0.0.11
10.0.0.12

[db]
10.0.0.21

[prod:children]
web
db

[prod:vars]
ansible_user=deploy
ansible_ssh_private_key_file=~/.ssh/deploy_key

分组不是形式主义,它直接决定你能对谁批量下命令。web 组一次发配置、db 组一次做备份、prod 整组跑合规检查——分组就是运维的「寻址能力」。机器再多也不怕,配合云的动态 Inventory(从云 API 实时拉取实例列表),新机器上线即自动纳入管理。

三个常用的临时过滤技巧:--limit web 只对 web 组操作,--limit 'db[0]' 只取组内第一台,--limit 'web: !10.0.0.12' 对 web 组但排除某台。变更窗口里先挑一台灰度,全靠 --limit 兜底。

Playbook:用 YAML 描述期望状态

Playbook 是 Ansible 的剧本。它不像 shell 脚本那样写「第一步干嘛第二步干嘛」,而是写「这台机器最终应该是什么样」。下面是一份装 Nginx 并起服务的最小剧本:

- hosts: web
  become: yes
  tasks:
    - name: 安装 nginx
      apt:
        name: nginx
        state: present
        update_cache: yes

    - name: 启动并设置开机自启
      service:
        name: nginx
        state: started
        enabled: yes

    - name: 部署首页
      copy:
        src: files/index.html
        dest: /var/www/html/index.html

几个关键约定:hosts 指定对哪组机器执行;become: yes 表示提权到 root;每个 task 有名字,执行时会打印出来,日志可读。跑之前先 ansible-playbook -C site.yml 干跑一遍(check 模式),预览会改什么再真跑,是被反复验证的好习惯。

幂等:Ansible 的核心思想

上面这份剧本,跑第一遍会真的去装 Nginx,跑第二遍它发现「已经装好了」,就什么都不做——这就是幂等:同样的操作执行一次和执行多次,系统最终状态一致。Ansible 绝大多数模块都是幂等的,跑完会用颜色告诉你哪些 task 真的改了东西(changed),哪些本来就是对的(ok)。

写法幂等性说明
apt / yum / copy / service幂等先检查当前状态,不一致才动手
command / shell非幂等原样执行,Ansible 不知道它改了什么
command + creates 参数可幂等化文件存在就跳过,适合跑一次性脚本

这带来一个重要纪律:能不用 shell 就不用 shell。真要用命令时,加上 creates 或 changelog 判断条件,让它在状态已达成时自动跳过。把 Playbook 写成幂等的,你才敢在凌晨两点直接重跑它而不担心把环境改坏。