Ansible批量更新补丁需先确保控制机安装、目标机免密SSH及Inventory配置正确;再用os_family变量精准识别系统类型;最后通过幂等Playbook实现缓存更新、全量升级与条件重启。

用 Ansible 批量更新操作系统补丁和软件包,核心是稳、准、安全——不是“能不能做”,而是“怎么避免翻车”。它不装客户端,靠 SSH 执行,天然适合生产环境;但跳过基础准备,连 ansible all -m ping 都通不过,更别说打补丁了。
先跑通三件套:控制机、免密 SSH、Inventory
90% 的失败卡在这一步,必须逐项确认:
-
控制机装好 Ansible:Ubuntu/Debian 运行
sudo apt install ansible;CentOS/RHEL 8+ 直接dnf install ansible-core;7 系需先启用 EPEL 源再安装 -
目标机开通免密 SSH:必须用
ssh-copy-id user@ip推送公钥,不能手动复制;检查/etc/ssh/sshd_config中PubkeyAuthentication yes已启用;~/.ssh权限为700,authorized_keys为600 -
Inventory 写对格式和位置:推荐在项目目录下建
hosts文件,严格按 INI 格式,例如:
[patch_targets]
192.168.1.10 ansible_user=ops
192.168.1.11 ansible_user=ops
识别系统类型:别硬编码发行版名
新版 Ansible 已弃用 ansible_distribution,且 Rocky、AlmaLinux 等返回值混乱。统一用 os_family 变量判断:
-
ansible_facts['os_family'] == "Debian"—— 覆盖 Ubuntu、Debian、Kali 等 -
ansible_facts['os_family'] == "RedHat"—— 覆盖 CentOS、RHEL、Rocky、AlmaLinux 等 - 如需版本约束,加
and ansible_facts['distribution_major_version'] | int >= 8 - 注意:若 Playbook 中写了
gather_facts: false,这些变量为空,条件任务会直接跳过
写一个安全、幂等的补丁 Playbook
下面是一个生产可用的最小化补丁剧本(patch.yml),兼顾 Debian 和 RHEL 系统,含缓存更新、全包升级、内核更新后自动重启逻辑:
- 先更新本地包索引:
• Debian/Ubuntu 用apt: update_cache: yes
• RHEL/CentOS 用yum: update_cache: yes或dnf: update_cache: yes - 再执行全量升级:
•package: name: "*" state: latest—— 自动适配系统默认包管理器 - 最后判断是否需重启:
• 使用reboot_required变量(由setup或facts提供)
• 配合reboot:模块,设置pre_reboot_delay和post_reboot_delay控制节奏
增强可控性:标签、暂停、分批与加密
补丁操作不是“一把梭”,得留退路、控节奏:
- 用
tags分离任务:比如tags: [update, reboot, verify],可单独运行某阶段:ansible-playbook patch.yml --tags update - 关键步骤前加
pause:比如升级后、重启前插入确认环节,防止误操作扩散 - 敏感变量用
ansible-vault加密:如 root 密码、API key,避免明文泄露 - 大集群分批执行:用
--limit或serial: 5控制每次只更新 5 台,降低风险面

















