Ansible 100 台服务器一键管控实战 进阶版

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),便于维护;
  • 定期更新服务器清单,确保和实际集群一致。

七、总结

关键点回顾

  1. Ansible管控100台服务器核心:免密登录+主机清单+并发控制,优先配置分组和全局变量;
  2. 基础操作用ansible命令(临时执行),标准化操作用Playbook(可复用、可审计);
  3. 避坑核心:分批执行核心业务、执行前测试、全量日志记录、控制并发数。

通过本文的方案,你可实现100台服务器的一键命令执行、文件分发、软件安装、配置标准化,兼顾效率与安全。生产环境中,建议结合AWX可视化管控+Git版本控制,形成完整的批量运维体系。

相关推荐
Trouvaille ~1 小时前
【项目篇】从零手写高并发服务器(一):项目介绍与开发环境搭建
linux·运维·服务器·网络·c++·高并发·muduo库
!沧海@一粟!1 小时前
Kylin/Linux 服务器健康一键巡检工具
linux·服务器·kylin
上海合宙LuatOS1 小时前
LuatOS核心库API——【ioqueue】IO序列化操作
linux·运维·服务器·网络·嵌入式硬件·物联网·硬件工程
️️(^~^)2 小时前
HAPORXY实验环境
linux·运维·服务器
不像程序员的程序媛2 小时前
阿里云负载均衡器知多少?
运维·服务器·负载均衡
赋创小助手2 小时前
服务器主板为何不再采用ATX?以超微X14DBM-AP 为例解析
运维·服务器·人工智能·深度学习·自然语言处理·硬件架构
欧云服务器2 小时前
宝塔邮局磁盘满了怎么清理?linux磁盘清理教程
运维·服务器
Purgatory0012 小时前
CSS 访问服务器
服务器·前端·css
科技块儿2 小时前
开发者需要为网站或应用集成IP归属地显示功能,如何选择可靠的数据源?
服务器·网络·数据库·tcp/ip·edge·ip