Ansible 100台服务器一键管控实战(完整版)
Ansible是100台服务器批量管理的企业级标准方案------无客户端、SSH原生连接、配置即代码、支持并发/分批/回滚,既能解决手工操作的低效问题,又能规避Shell脚本的稳定性风险。本文从环境搭建、核心功能、实战场景到避坑指南,完整覆盖100台服务器的一键管控全流程,所有脚本可直接复制落地。
一、前置条件(必看)
1. 环境要求
| 角色 | 配置要求 | 系统要求 |
|---|---|---|
| 控制节点 | 2核4G以上(任意Linux) | CentOS7+/Ubuntu18.04+ |
| 被控节点 | 无最低配置要求 | 主流Linux发行版(100台) |
2. 核心优势(适配100台规模)
- ✅ 无客户端:被控端仅需SSH和Python(Linux默认自带);
- ✅ 并行执行:可指定并发数(100台建议50并发),秒级完成操作;
- ✅ 幂等性:重复执行同一操作不会导致异常(如重复安装软件);
- ✅ 可审计:所有操作可通过Playbook脚本追溯,避免人工误操作;
- ✅ 全场景覆盖:命令执行、文件分发、软件安装、配置管理、服务管控。
二、环境搭建(控制节点+100台被控节点)
1. 控制节点安装Ansible
bash
# CentOS/RHEL
yum install -y epel-release && yum install -y ansible
# Ubuntu/Debian
apt update && apt install -y ansible
# 验证安装
ansible --version # 输出ansible 2.14+版本即可(推荐2.10+)
2. 免密登录配置(核心!避免100台服务器输密码)
Ansible默认通过SSH连接,100台服务器必须配置免密,否则批量操作无意义。
bash
# 步骤1:控制节点生成SSH密钥(无密码回车)
ssh-keygen -t rsa -b 2048 -N "" -f ~/.ssh/id_rsa
# 步骤2:批量分发公钥到100台被控节点(两种方式)
## 方式1:手动(适合少量服务器,示例)
ssh-copy-id root@192.168.1.10
ssh-copy-id root@192.168.1.11
# ... 重复100次(不推荐,仅演示)
## 方式2:脚本批量分发(推荐100台规模)
# 新建服务器清单文件:hosts.txt(格式:IP:用户名:密码)
cat > hosts.txt << EOF
192.168.1.10:root:Passwd@123
192.168.1.11:root:Passwd@123
# ... 补充剩余98台服务器
EOF
# 批量分发公钥脚本
cat > ssh_copy_batch.sh << EOF
#!/bin/bash
# 安装sshpass(免交互输密码)
yum install -y sshpass > /dev/null 2>&1 || apt install -y sshpass > /dev/null 2>&1
# 遍历服务器清单
while IFS=":" read -r IP USER PWD; do
if [[ -z \$IP || \$IP =~ ^# ]]; then
continue
fi
echo "===== 分发公钥到 \$IP ====="
sshpass -p "\$PWD" ssh-copy-id -o StrictHostKeyChecking=no \$USER@\$IP > /dev/null 2>&1
if [ \$? -eq 0 ]; then
echo "\$IP 公钥分发成功"
else
echo "\$IP 公钥分发失败"
fi
done < hosts.txt
EOF
# 执行脚本
chmod +x ssh_copy_batch.sh
./ssh_copy_batch.sh
3. 配置Ansible主机清单(核心配置)
Ansible通过主机清单管理服务器,支持分组、变量,适配100台服务器的分类管控(如按业务/机房分组)。
bash
# 编辑默认清单文件(也可自定义)
vim /etc/ansible/hosts
# 配置示例(100台服务器分组管理)
[all_servers] # 所有100台服务器总组
192.168.1.[10:109] # 批量简写(192.168.1.10~192.168.1.109,共100台)
[web_servers] # Web业务组(示例:20台)
192.168.1.[10:29]
[db_servers] # 数据库组(示例:10台)
192.168.1.[30:39]
[other_servers] # 其他业务组(示例:70台)
192.168.1.[40:109]
# 全局变量(所有服务器通用)
[all_servers:vars]
ansible_ssh_user=root # 登录用户
ansible_ssh_port=22 # SSH端口
ansible_python_interpreter=/usr/bin/python3 # Python路径(避免执行报错)
4. 测试连通性(验证100台服务器)
bash
# 测试所有服务器连通性(并发数50,100台秒级完成)
ansible all_servers -f 50 -m ping
# 输出示例(成功为pong,失败会标注)
192.168.1.10 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": false,
"ping": "pong"
}
# ... 剩余99台输出
三、100台服务器核心管控操作(一键执行)
1. 批量执行命令(基础操作)
支持任意Linux命令,一键下发到100台服务器,按组/全量执行均可。
bash
# 语法:ansible <组名> -f <并发数> -m <模块> -a <命令>
# 示例1:所有100台服务器查看内存使用
ansible all_servers -f 50 -m command -a "free -m"
# 示例2:Web组20台服务器查看磁盘占用
ansible web_servers -f 20 -m shell -a "df -h | grep /data"
# 示例3:所有服务器同步时间(关键!避免集群时间不一致)
ansible all_servers -f 50 -m shell -a "ntpdate ntp.aliyun.com && hwclock -w"
# 示例4:执行复杂脚本(本地脚本一键下发并执行)
# 先写本地脚本:test.sh
cat > test.sh << EOF
#!/bin/bash
echo "服务器IP:\$(hostname -I)"
echo "当前时间:\$(date)"
echo "CPU核心数:\$(nproc)"
EOF
# 一键下发并执行
ansible all_servers -f 50 -m copy -a "src=./test.sh dest=/tmp/test.sh mode=0755"
ansible all_servers -f 50 -m shell -a "/tmp/test.sh > /tmp/server_info.log"
2. 批量文件分发(配置/安装包)
一键将本地文件/目录分发到100台服务器,支持权限、所有者配置。
bash
# 示例1:分发nginx配置文件到所有Web服务器
ansible web_servers -f 20 -m copy -a "src=/etc/nginx/nginx.conf dest=/etc/nginx/nginx.conf owner=root group=root mode=0644"
# 示例2:分发安装包(如jdk)到所有服务器
ansible all_servers -f 50 -m copy -a "src=/opt/jdk-17.tar.gz dest=/opt/jdk-17.tar.gz"
# 示例3:同步目录(如项目代码)到Web服务器
ansible web_servers -f 20 -m synchronize -a "src=/var/www/html/ dest=/var/www/html/ delete=yes"
# delete=yes:保持远程目录和本地一致(删除多余文件)
3. 批量安装/卸载软件(全量/分组)
支持yum/apt/pip等包管理器,幂等执行(已安装则跳过)。
bash
# 示例1:所有服务器安装docker
ansible all_servers -f 50 -m yum -a "name=docker state=installed"
# 示例2:Web服务器安装nginx+php
ansible web_servers -f 20 -m yum -a "name=nginx,php-fpm state=installed"
# 示例3:卸载多余软件(如telnet)
ansible all_servers -f 50 -m yum -a "name=telnet state=absent"
# 示例4:安装指定版本软件(如nginx-1.24)
ansible web_servers -f 20 -m yum -a "name=nginx-1.24.0 state=installed"
4. 批量管控服务(启动/重启/开机自启)
bash
# 示例1:所有服务器启动docker并设置开机自启
ansible all_servers -f 50 -m service -a "name=docker state=started enabled=yes"
# 示例2:Web服务器重启nginx(先验证配置再重启,避免报错)
ansible web_servers -f 20 -m shell -a "nginx -t && systemctl restart nginx"
# 示例3:数据库服务器重启mysql,并检查状态
ansible db_servers -f 10 -m service -a "name=mysqld state=restarted"
ansible db_servers -f 10 -m command -a "systemctl status mysqld | grep Active"
5. 批量配置管理(替换配置/修改参数)
通过lineinfile/replace模块修改配置文件,避免手动编辑。
bash
# 示例1:修改所有服务器的SSH端口(从22改为2222)
ansible all_servers -f 50 -m lineinfile -a "path=/etc/ssh/sshd_config regexp='^Port' line='Port 2222'"
ansible all_servers -f 50 -m service -a "name=sshd state=restarted"
# 示例2:禁用所有服务器的root远程登录
ansible all_servers -f 50 -m lineinfile -a "path=/etc/ssh/sshd_config regexp='^PermitRootLogin' line='PermitRootLogin no'"
# 示例3:替换配置文件中的变量(如替换数据库地址)
ansible web_servers -f 20 -m replace -a "path=/etc/php.ini regexp='192.168.1.30' replace='192.168.1.31'"
四、进阶实战:Playbook(100台服务器标准化配置)
单条命令适合临时操作,Playbook适合标准化、可复用、复杂场景(如100台服务器初始化、业务部署)。
1. 编写Playbook(服务器初始化示例)
新建server_init.yml,实现100台服务器一键初始化(关闭防火墙、优化内核、安装基础工具):
yaml
---
- hosts: all_servers # 针对所有100台服务器
remote_user: root # 登录用户
gather_facts: true # 收集服务器信息(如系统版本)
serial: 50 # 分批执行(每批50台,避免负载过高)
tasks:
# 任务1:关闭防火墙和SELinux
- name: 关闭firewalld
service:
name: firewalld
state: stopped
enabled: no
- name: 关闭SELinux
lineinfile:
path: /etc/selinux/config
regexp: '^SELINUX='
line: 'SELINUX=disabled'
- name: 立即生效SELinux
command: setenforce 0
ignore_errors: yes # 忽略已关闭的报错
# 任务2:安装基础工具
- name: 安装常用工具
yum:
name: [wget, vim, net-tools, ntpdate]
state: installed
# 任务3:优化内核参数
- name: 添加内核配置
copy:
content: |
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
dest: /etc/sysctl.d/k8s.conf
mode: 0644
- name: 生效内核参数
command: sysctl --system
# 任务4:同步时间
- name: 同步系统时间
shell: ntpdate ntp.aliyun.com && hwclock -w
# 任务5:禁用swap
- name: 关闭swap
command: swapoff -a
- name: 永久禁用swap
lineinfile:
path: /etc/fstab
regexp: 'swap'
line: '#\0'
backrefs: yes
2. 执行Playbook(一键初始化100台服务器)
bash
# 执行Playbook(并发数50,分批执行)
ansible-playbook -f 50 server_init.yml
# 执行结果说明:
# PLAY [all_servers] :任务开始
# TASK [Gathering Facts] :收集服务器信息
# TASK [关闭firewalld] :执行对应任务
# ... 每个任务会显示成功/失败的服务器数量
# PLAY RECAP :汇总(如100台成功,0台失败)
3. Playbook高级技巧(适配100台规模)
- 分批执行 :
serial: 20(每批20台,核心业务必用,避免雪崩); - 失败重试 :添加
retries: 3(失败重试3次); - 条件执行:按系统版本执行不同操作(如CentOS7/8区分);
- 变量复用 :通过
vars定义变量,避免硬编码。
示例(条件执行+失败重试):
yaml
tasks:
- name: 安装docker(CentOS7)
yum:
name: docker
state: installed
when: ansible_distribution == "CentOS" and ansible_distribution_major_version == "7"
retries: 3
delay: 5 # 重试间隔5秒
register: result
until: result is succeeded
五、100台服务器管控避坑指南(核心)
1. 性能与效率坑
- 坑1 :并发数设置过高(如100),导致控制节点/被控节点负载过高。
✅ 避坑方案:并发数设为50(100台),核心业务服务器设为20,避免同时操作所有服务器。 - 坑2 :执行长耗时操作(如安装软件)时阻塞,无进度反馈。
✅ 避坑方案:使用ansible-playbook -v查看详细进度,或拆分任务为多个Playbook。
2. 连接与权限坑
-
坑1 :部分服务器SSH端口非22,导致连接失败。
✅ 避坑方案:在主机清单中按服务器配置端口变量:ini[special_servers] 192.168.1.20 ansible_ssh_port=2222 192.168.1.21 ansible_ssh_port=2222 -
坑2 :普通用户执行无权限,sudo提示输密码。
✅ 避坑方案:被控端配置sudo免密,或Playbook中添加sudo: yes:yaml- hosts: all_servers remote_user: ops become: yes # 等同于sudo become_method: sudo
3. 执行安全坑
- 坑1 :批量重启服务导致业务雪崩(如100台Web服务器同时重启)。
✅ 避坑方案:- 使用
serial分批重启:serial: 10(每批10台,间隔5分钟); - 核心业务添加健康检查:重启后验证服务可用再执行下一批。
- 使用
- 坑2 :误操作全量服务器(如误删文件)。
✅ 避坑方案:- 执行前先在测试机验证:
ansible web_servers --limit 192.168.1.10 -m command -a "rm -rf /tmp/test"; - Playbook中添加
check_mode: yes(模拟执行,不实际操作)。
- 执行前先在测试机验证:
4. 结果追溯坑
- 坑 :批量操作后无日志,无法定位失败服务器。
✅ 避坑方案:- 执行命令时输出日志到文件:
ansible all_servers -f 50 -m command -a "free -m" > /tmp/server_mem.log; - Playbook执行日志:
ansible-playbook server_init.yml > /tmp/init_log.log 2>&1; - 提取失败服务器:
grep "FAILED" /tmp/init_log.log | awk '{print $1}' > /tmp/fail_servers.txt。
- 执行命令时输出日志到文件:
六、企业级优化(100台服务器生产环境必配)
1. 配置Ansible加速(提升执行效率)
bash
# 编辑ansible配置文件
vim /etc/ansible/ansible.cfg
# 添加以下配置
[defaults]
host_key_checking = False # 关闭主机密钥检查
pipelining = True # 开启管道模式,减少SSH连接次数
forks = 50 # 默认并发数50
timeout = 10 # SSH连接超时10秒
[ssh_connection]
control_path = %(directory)s/%%h-%%r # 优化SSH控制路径
control_master = auto # 开启SSH长连接
control_persist = 30s # 长连接保持30秒
2. 搭建Ansible Tower/AWX(可视化管控)
对于团队使用场景,可搭建AWX(Ansible Tower开源版),实现:
- Web界面一键执行Playbook;
- 100台服务器可视化分组;
- 操作审计日志、权限管控;
- 定时任务(如每日服务器巡检)。
3. 配置管理与版本控制
- 将Playbook、配置文件纳入Git管理,避免脚本丢失;
- 按业务划分Playbook(如
web_init.yml/db_init.yml),便于维护; - 定期更新服务器清单,确保和实际集群一致。
七、总结
关键点回顾
- Ansible管控100台服务器核心:免密登录+主机清单+并发控制,优先配置分组和全局变量;
- 基础操作用
ansible命令(临时执行),标准化操作用Playbook(可复用、可审计); - 避坑核心:分批执行核心业务、执行前测试、全量日志记录、控制并发数。
通过本文的方案,你可实现100台服务器的一键命令执行、文件分发、软件安装、配置标准化,兼顾效率与安全。生产环境中,建议结合AWX可视化管控+Git版本控制,形成完整的批量运维体系。