概述
你手头有五台以上的服务器吗?每次都要一台台ssh进去装软件、改配置、重启服务?Ansible 就是来解决这个痛点的。
Ansible 是一个基于 Python 的自动化运维工具。它不需要在被控服务器上装任何客户端,只要 SSH 能通就行。你用 YAML 写好剧本(Playbook),一条命令就能让一百台服务器同时执行。
这篇教程教你从零开始搭建 Ansible 环境,写第一个 Playbook,搞定日常运维。
准备工作
你需要这些:
- 一台作为控制机的机器(可以是你的笔记本、Mac、或者一台 VPS),推荐 Ubuntu 22.04+ 或 macOS
- 至少一台被管理的目标服务器(同样推荐 Ubuntu/Debian)
- SSH 密钥登录已经配好,控制机能免密 ssh 到目标机
- 控制机上有 Python 3.8+
先确认 Python 版本:
python3 --version
看到 3.8 以上的输出就行。
步骤
第1步:安装 Ansible
在控制机上执行:
sudo apt update
sudo apt install -y ansible
装完后检查版本:
ansible --version
输出类似 ansible [core 2.17.x] 就说明装好了。
如果你用的是 macOS:
brew install ansible
如果是 Python pip 方式安装(任何系统通用):
pip3 install ansible
第2步:配置主机清单
Ansible 需要一个文件来知道要管理哪些机器。编辑主机清单文件:
nano ~/.ansible/hosts
如果目录不存在先创建:
mkdir -p ~/.ansible
在里面写入你的服务器列表,按功能分组:
[webservers]
192.168.1.10 ansible_user=ubuntu
192.168.1.11 ansible_user=ubuntu
[databases]
192.168.1.20 ansible_user=root
你也可以用域名代替 IP。关键是要写对用户名,Ansible 会用这个用户 SSH 登录。
保存后,测试连通性:
ansible all -m ping
如果每台机器都返回 SUCCESS,说明 SSH 密钥登录配置正确。看到 UNREACHABLE 就回去检查 SSH 密钥和防火墙。
第3步:创建第一个 Playbook
在项目目录下新建文件:
mkdir -p ~/ansible-playbooks && cd ~/ansible-playbooks
nano deploy.yaml
写入以下内容:
---
- name: 基础环境配置
hosts: webservers
become: yes
tasks:
- name: 更新系统软件包
apt:
update_cache: yes
upgrade: dist
- name: 安装常用工具
apt:
name:
- curl
- wget
- git
- htop
- nginx
state: present
- name: 创建部署用户
user:
name: deployer
groups: sudo
shell: /bin/bash
- name: 设置防火墙规则
ufw:
rule: allow
port: "{{ item }}"
proto: tcp
loop:
- 22
- 80
- 443
这个 Playbook 做了四件事:更新系统、装常用工具和 Nginx、创建部署用户、开防火墙端口。
第4步:执行 Playbook
运行刚才写的剧本:
ansible-playbook deploy.yaml -u ubuntu --key-file ~/.ssh/id_rsa
参数说明:
-u ubuntu指定 SSH 登录用户--key-file指定私钥路径(如果用默认密钥可以省略)
你会看到类似这样的输出:
PLAY [基础环境配置] *******************************
TASK [Gathering Facts] ***************************
ok: [192.168.1.10]
ok: [192.168.1.11]
TASK [更新系统软件包] ****************************
changed: [192.168.1.10]
changed: [192.168.1.11]
TASK [安装常用工具] ******************************
changed: [192.168.1.10] => (item=[...])
changed: [192.168.1.11] => (item=[...])
PLAY RECAP ***************************************
192.168.1.10 : ok=4 changed=3 unreachable=0 failed=0
192.168.1.11 : ok=4 changed=3 unreachable=0 failed=0
changed 表示执行了实际操作,ok 表示任务已通过无需变更。全部 failed=0 就说明成功了。
第5步:编写变量文件
把敏感信息抽离出来,保持 Playbook 干净。创建变量文件:
nano vars/main.yaml
---
deploy_username: deployer
firewall_ports:
- 22
- 80
- 443
packages:
- curl
- wget
- git
- htop
- nginx
然后在 Playbook 里引用:
---
- name: 基础环境配置
hosts: webservers
become: yes
vars_files:
- vars/main.yaml
tasks:
- name: 安装常用工具
apt:
name: "{{ packages }}"
state: present
第6步:使用 Inventory 文件替代默认清单
当服务器变多的时候,把配置写在 ~/.ansible/hosts 就不好维护了。在项目里建一个 inventory 文件:
mkdir -p ~/ansible-playbooks/inventory
nano ~/ansible-playbooks/inventory/staging.ini
[webservers]
web1.example.com ansible_user=ubuntu
web2.example.com ansible_user=ubuntu
[databases]
db1.example.com ansible_user=root
[all:vars]
ansible_python_interpreter=/usr/bin/python3
执行时指定 inventory:
ansible-playbook -i inventory/staging.ini deploy.yaml
验证
用下面的命令全面检查 Ansible 环境:
# 检查 Ansible 版本
ansible --version
# 测试所有主机的连通性
ansible all -m ping -i inventory/staging.ini
# 查看某台机器的facts(系统信息)
ansible web1.example.com -m setup -i inventory/staging.ini
# 试运行模式(不真正执行,只预览会做什么)
ansible-playbook --check deploy.yaml -i inventory/staging.ini
--check 模式是 Ansible 的杀手级功能。它不会真的改任何东西,只会告诉你哪些任务会执行变更。上线前先用这个模式过一遍,安全很多。
常见问题
Q: SSH 连接超时怎么办?
检查目标机的 SSH 端口是不是默认的 22。如果不是,在 inventory 里加一行:
web1.example.com ansible_port=2222 ansible_user=ubuntu
Q: 提示 “MODULE FAILURE” 或 “FAILED!"?
大概率是目标机上没有 Python。Ansible 需要在目标机上跑 Python 脚本。修复:
ssh root@目标IP "apt install -y python3"
Q: 怎么管理多台环境的配置?
用不同的 inventory 文件。比如 inventory/dev.ini、inventory/prod.ini,每个文件对应一组服务器。执行时指定对应的文件就行。
Q: Playbook 重复执行会不会出问题?
不会。Ansible 是幂等的。第二次运行同一个 Playbook,发现配置已经是目标状态,就不会做任何变更,所有任务都会显示 ok 而不是 changed。
Q: 想批量执行一条命令,不想写 Playbook 怎么办?
直接用 ansible 命令行:
ansible all -m shell -a "df -h" -i inventory/staging.ini
这会在一百台机器上同时执行 df -h,结果汇总输出。
Ansible 学起来门槛不高,但用起来能省大量时间。建议先从上面这个基础环境配置 Playbook 开始,慢慢往里加内容。等你熟练了,再去学角色(Roles)和动态 Inventory,那又是另一个层次的效率提升。
你平时运维最难搞的是哪一步?手动部署还是配置漂移?评论区说说。