
你还在手动配服务器吗?
先问你一个问题:上次配置一台新服务器,你花了多久?
如果只有一台,半小时可能还能忍。但如果你公司有10台、20台服务器呢?每台重复同样的操作——更新系统、装Nginx、配PHP、改防火墙、传文件、重启服务。枯燥,而且容易出错。
有人统计过,手动配置服务器时,每10台机器至少有1台的配置会和其他的不一样。少装了一个扩展,忘了开某个端口,配置文件复制错了路径。这些差异平时看不出来,一出问题,排查难度直接翻倍。
这就是为什么需要Ansible。
Ansible是什么?怎么工作?
Ansible是一个自动化运维工具。它做的事情就是:你写好一份配置清单,告诉它“服务器应该装什么软件、配置文件放哪里、哪些服务要启动”,然后它SSH连上服务器,自动帮你搞定。
几个特点:
- 不需要在被控服务器上装任何东西,只要SSH能连上,Python环境有就行了(Linux默认都有)。这一点比很多其他运维工具方便很多。
- 用YAML写配置,就是纯文本文件,可以放进Git仓库里管理。
- 执行是幂等的,同一个配置跑多次,结果一样。不会因为你多跑一遍就重复装软件、重复重启服务。
安装与基础配置
第一步:控制机安装Ansible
控制机可以是你自己的电脑,也可以是公司的一台跳板机。
Ubuntu/Debian:
bash
sudo apt update sudo apt install ansible -y
CentOS/RHEL:
bash
sudo yum install epel-release -y sudo yum install ansible -y
装完之后验证一下:
bash
ansible --version
第二步:配置SSH免密登录
Ansible靠SSH连接服务器,所以要提前配好免密登录(之前的文章讲过,ssh-keygen + ssh-copy-id)。配完之后测试一下:
bash
ssh root@你的服务器IP
不需要输密码,就对了。
第三步:定义服务器清单
编辑/etc/ansible/hosts,把你要管理的服务器写进去。可以按功能分组:
ini
[web] 192.168.1.10 192.168.1.11 [db] 192.168.1.20 [all:vars] ansible_user=root
测试连通性:
bash
ansible all -m ping
每台机器返回"pong",说明Ansible可以连上它们了。
单次任务:用Ad-hoc命令
写完整剧本之前,先试试单条命令。比如批量查看时间:
bash
ansible web -m command -a "date"
批量安装Nginx:
bash
ansible web -m apt -a "name=nginx state=present"
批量重启服务:
bash
ansible web -m service -a "name=nginx state=restarted"
这些命令适合做一次性操作。日常工作大部分场景还是用Playbook。
核心功能:写Playbook
Playbook是Ansible的配置文件,YAML格式。下面是一个配置Web服务器的例子。
创建一个文件setup-web.yml:
yaml
---
- name: 配置Web服务器
hosts: web
become: yes
tasks:
- name: 更新apt缓存
apt:
update_cache: yes
- name: 安装Nginx和PHP
apt:
name:
- nginx
- php8.1-fpm
state: present
- name: 创建网站目录
file:
path: /var/www/mysite
state: directory
owner: www-data
group: www-data
mode: '0755'
- name: 复制Nginx配置文件
copy:
src: ./files/mysite.conf
dest: /etc/nginx/sites-available/mysite.conf
- name: 启用站点
file:
src: /etc/nginx/sites-available/mysite.conf
dest: /etc/nginx/sites-enabled/mysite.conf
state: link
- name: 启动Nginx
service:
name: nginx
state: started
enabled: yes
执行这个playbook:
bash
ansible-playbook setup-web.yml
Ansible会按照顺序执行每个任务:更新缓存→安装软件→创建目录→复制配置→启用站点→启动服务。如果某台机器已经装过了,Ansible会跳过,不会重复执行。
常用的几个模块
| 模块 | 用途 | 示例 |
|---|---|---|
copy | 把本地文件传到服务器 | src=./file dest=/remote/path |
file | 创建目录或设置权限 | path=/tmp/dir state=directory |
apt / yum | 安装软件包 | name=nginx state=present |
service | 启停服务、设置开机自启 | name=nginx state=started enabled=yes |
shell | 执行shell命令 | cmd="df -h" |
lineinfile | 修改配置文件中的某一行 | 替换或添加配置项 |
每个模块的详细用法都可以用ansible-doc 模块名查看。
生产环境建议
如果你要把Ansible用到实际工作中,有几个建议:
1. 用目录结构管理
text
ansible/ ├── inventory/ # 环境区分 │ ├── production │ └── staging ├── playbooks/ # 剧本文件 ├── roles/ # 角色(复用配置) └── files/ # 需分发的文件
2. Playbook写完后先测试
加了--check参数,只模拟不执行:
bash
ansible-playbook setup-web.yml --check
3. 只对单台机器执行
加--limit参数:
bash
ansible-playbook setup-web.yml --limit 192.168.1.10
4. 把playbook纳入Git管理
配置文件就是文档。团队里谁改了配置,commit记录一目了然。
总结
Ansible的核心价值就三点:
- 一致性:同一份playbook,任何机器执行结果一样
- 可重复:新服务器上线,跑一遍playbook就行
- 可审计:playbook本身就是配置文档
初次配置Ansible环境大概要1小时。之后每新来一台服务器,运行一遍playbook,5分钟内就能完成初始化。
如果你的服务器数量超过3台,Ansible带来的效率提升是值得投入这个时间的。




