使用 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 模块安装。
命令速用版
如果已配置好 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 更适合复杂的漏洞修复流程,支持条件判断、错误处理和状态等待。以下示例展示了如何安全地更新包并重启服务。
---
- 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 命令里 -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 阶段已经失败了。