怎么使用 Ansible 批量管理多台 Linux 主机漏洞修复

文章导读
使用 Ansible 批量修复漏洞的核心在于通过 SSH 通道下发补丁更新命令或修复脚本,适合管理数十到数百台 Linux 主机。但必须先打通免密登录并确认远程 Python 环境,否则任务极易失败。
📋 目录
  1. 前置环境检查
  2. 命令速用版
  3. 完整 Playbook 示例
  4. 验证与回滚方案
  5. 常见坑与排查
  6. 官方文档参考
A A

使用 Ansible 批量修复漏洞的核心在于通过 SSH 通道下发补丁更新命令或修复脚本,适合管理数十到数百台 Linux 主机。但必须先打通免密登录并确认远程 Python 环境,否则任务极易失败。

先说结论:Ansible 能批量管理 Linux 服务器漏洞修复,但不是装完就能用,免密 SSH、正确 inventory、模块选对这三步卡住 90% 新手。

  • 先判断:确认控制机到目标机的 SSH 免密连通性,避免 UNREACHABLE 错误。
  • 优先做:优先使用 yum/dnf/apt 模块进行包更新,而非直接拼接 shell 命令。
  • 再验证:修复后通过版本号查询或服务状态检查确认漏洞是否闭合,高风险操作需预留回滚方案。

前置环境检查

1. 准备 inventory 与免密登录
在控制机生成密钥并分发到所有目标主机。目标机家目录的 .ssh 权限必须是 700,authorized_keys 必须是 600,否则 sshd 会静默拒绝。若目标机禁用了密码登录且未开 pubkey 认证,ssh-copy-id 会失败,此时需通过控制台(VNC/IPMI)手动写入公钥。

2. 确认 Python 解释器路径
很多新系统(如 CentOS 8、Ubuntu 22.04)默认只有 python3 且没建 python 软链。若报错/usr/bin/python: bad interpreter,需在 inventory 里统一指定 ansible_python_interpreter=/usr/bin/python3。如果目标机连 python3 都没装,得先用 raw 模块安装。

怎么使用 Ansible 批量管理多台 Linux 主机漏洞修复

命令速用版

如果已配置好 inventory 和免密登录,可使用以下 ad-hoc 命令快速执行更新和检查。注意:涉及服务重启的操作存在断开连接风险,生产环境慎用。

# 检查特定软件版本(例如 polkit)
ansible all -m shell -a "rpm -qa | grep polkit"

# 使用 yum 模块批量更新特定包
ansible all -m yum -a "name=polkit state=latest"

# 【高风险】重启相关服务使修复生效(需确保有其他连接通道或配合 wait_for)
ansible all -m service -a "name=sshd state=restarted"

安全警示:直接通过 Ansible 重启远程 sshd 服务极易导致当前会话中断且无法自动恢复。若必须重启,建议配合 wait_for 模块等待端口恢复,或确保拥有 IPMI/控制台等带外管理权限。

完整 Playbook 示例

相比 ad-hoc 命令,Playbook 更适合复杂的漏洞修复流程,支持条件判断、错误处理和状态等待。以下示例展示了如何安全地更新包并重启服务。

怎么使用 Ansible 批量管理多台 Linux 主机漏洞修复
---
- name: Batch Vulnerability Remediation
  hosts: all
  become: yes
  gather_facts: yes
  tasks:
    - name: Update cache (RedHat)
      yum:
        update_cache: yes
      when: ansible_os_family == "RedHat"

    - name: Update cache (Debian)
      apt:
        update_cache: yes
      when: ansible_os_family == "Debian"

    - name: Install security updates (Example: polkit)
      package:
        name: polkit
        state: latest
      notify: Restart SSH

    - name: Check service status
      service:
        name: sshd
        state: started
      register: sshd_status
      failed_when: sshd_status.failed

  handlers:
    - name: Restart SSH
      service:
        name: sshd
        state: restarted
      # 重启后等待端口恢复,防止连接中断导致后续任务失败
      - wait_for:
          port: 22
          timeout: 60
          sleep: 5

验证与回滚方案

修复完成后,不要只看 Ansible 的 changed 状态,需登录目标机或再次通过 Ansible 查询版本号。例如修复 Polkit 漏洞后,再次执行 rpm -qa | grep polkit 确认版本已更新。对于服务类修复,使用 service 模块检查状态是否为 started 且 enabled=yes。

回滚策略:在执行批量更新前,建议对关键配置文件使用 copy 模块的 backup 参数备份。若更新导致业务异常,可通过包管理器的 downgrade 功能回退版本,或恢复备份的配置文件。生产环境建议在测试机验证 Playbook 后再批量执行。

常见坑与排查

SSH 权限问题:免密登录失败时,ssh-copy-id 报错 Permission denied 的真实原因往往是目标机 .ssh 目录权限不对,而不是 Ansible 的问题。

怎么使用 Ansible 批量管理多台 Linux 主机漏洞修复

模块选择错误:ansible 命令里 -m command 和 -m shell 到底该用哪个?command 是最安全的默认模块,但最受限;shell 支持管道但有注入风险。查看远程主机 PATH 是否一致时,用 command 模块 echo $PATH 会输出空,改用 shell 才能生效。

批量任务执行位置:批量改配置文件却只生效一台,可能是忘了用 delegate_to 或 run_once。若要生成一个全局唯一 token 写进所有机器,需控制执行位置,否则每台都去读一次本地文件可能导致不一致。

事实收集失败:运行 playbook 报错 module not found 往往是 Python 模块路径和解释器不一致。别在 playbook 顶层写 vars 设 ansible_python_interpreter,它只对当前 play 生效,而 setup 阶段已经失败了。

官方文档参考