运维批量管理工具Ansible实操
开始前需要准备好的三样东西
Ansible 是一个基于 SSH 的批量管理工具,你只需要一台装有 Linux 的机器作为控制节点,不需要在被管服务器上安装额外软件。
- 控制节点:推荐 Ubuntu 20.04 以上或 CentOS 7/8,2G 内存即可。
- 被管节点:任意 Linux 服务器,能通过 SSH 连接。
- SSH 密钥对:在控制节点用
ssh-keygen -t rsa -b 4096生成,然后通过ssh-copy-id root@被管IP把公钥复制到每台被管节点,实现免密登录。
确认你自己有 root 权限 或者可以使用 sudo -i 提权。
安装 Ansible 与控制节点配置
在控制节点上执行安装命令:
# Ubuntu / Debian 系列
sudo apt update && sudo apt install ansible -y
# CentOS / RHEL 系列
sudo yum install epel-release -y && sudo yum install ansible -y
装好后检查版本:
ansible --version
输出会显示 Python 版本和配置文件路径,默认配置文件在 /etc/ansible/ansible.cfg。
接着编辑主机清单文件 /etc/ansible/hosts,把你要管理的服务器 IP 写进去:
[webservers]
192.168.1.101
192.168.1.102
[dbservers]
192.168.1.201
方括号内的 webservers、dbservers 是分组名,你可以按业务划分。
编写第一个批量执行任务
先测试连通性,执行以下命令,-i 指定清单文件(如果用的是默认文件可以省略),-m 指定模块:
ansible all -i /etc/ansible/hosts -m ping
如果返回绿色 "ping": "pong",说明连接成功。
接着用 command 模块批量查看所有服务器 uptime:
ansible webservers -m command -a 'uptime'
如果想让结果更直观,可以用 shell 模块执行管道命令:
ansible dbservers -m shell -a 'free -h | grep Mem'
当你需要重复执行一组操作时,建议写成 Playbook(YAML 文件)。
新建一个文件 first.yml:
---
- name: 在 webservers 上安装 nginx
hosts: webservers
become: yes
tasks:
- name: 安装 nginx
apt:
name: nginx
state: present
when: ansible_os_family == "Debian"
- name: 启动 nginx 并设置开机自启
service:
name: nginx
state: started
enabled: yes
使用 ansible-playbook first.yml 执行,Ansible 会根据每台机器的系统发行版自动跳过不适用的任务。
避坑:新手最常遇到的三个问题
1. SSH 连接失败
如果 ansible all -m ping 报错 Permission denied (publickey),请检查 SSH 密钥是否正确复制;或者在被管节点上执行 systemctl status sshd 确认 SSH 服务正常运行。
2. Python 解释器找不到
部分最小化系统未装 Python,被管节点需要运行:
# CentOS / RHEL
sudo yum install python3 -y
# Ubuntu / Debian
sudo apt install python3 -y
3. Playbook 执行时权限不足
当安装软件或修改系统文件时,需要在 Playbook 的 hosts 下面加上 become: yes,或者执行 ansible-playbook 时加 -b 参数。
如果任务卡住很久,可以加上 -vvv 开启详细日志:ansible-playbook first.yml -vvv
验证批量管理效果
执行以下命令确认 nginx 已经在所有 webservers 上运行:
ansible webservers -m shell -a 'systemctl is-active nginx'
返回全部 active 即成功。
也可以写一个简单的验证 Playbook:
---
- name: 验证 nginx 端口监听
hosts: webservers
tasks:
- name: 检查 80 端口
shell: ss -tlnp | grep 80
register: result
- debug: var=result.stdout_lines
如果你需要管理几十上百台服务器,建议把主机清单按业务、地区、环境分组,并定期用 ansible all -m ping 做一次连通性巡检。
掌握这些基础操作后,就能慢慢搭建完整的自动化运维体系了。