Linux中用Ansible批量更新系统软件包需先验证控制节点与目标主机连通性,再按os_family变量区分Debian系(apt)和RedHat系(dnf/yum)执行安全升级,支持幂等、分批、预演及加密管控。

Linux 中用 Ansible 批量更新操作系统软件包,核心是识别发行版类型、安全拉取最新缓存、执行全量升级,并按需控制重启行为。整个过程无需人工逐台登录,支持幂等执行和分批灰度,适合生产环境常态化维护。
确保基础环境就绪
这是所有后续操作的前提:
- 控制节点已安装 Ansible(推荐 2.14+),执行 ansible --version 可验证
- 目标主机已配置 SSH 免密登录,且 ansible_user 有 sudo 权限(或直接使用 root)
- Inventory 文件(如 hosts)中正确分组,例如:
[patch_targets]
192.168.1.10 ansible_user=ops
192.168.1.11 ansible_user=ops - 运行 ansible patch_targets -m ping 返回 SUCCESS,说明连通性正常
按系统家族区分处理逻辑
不能硬写 ansible_distribution == "Ubuntu",新版 Ansible 已弃用该变量。应统一用 ansible_facts['os_family'] 判断:
- Debian 系(含 Ubuntu、Debian、Kali):先 apt update,再 apt upgrade -y
- RedHat 系(含 RHEL、CentOS、Rocky、AlmaLinux):用 dnf upgrade -y(RHEL 8+)或 yum update -y(RHEL 7)
- Playbook 中必须保留 gather_facts: true(默认开启),否则 os_family 为空
编写安全可控的补丁 Playbook
下面是一个生产可用的最小化剧本(保存为 update-packages.yml):
- name: Batch update OS packages
hosts: patch_targets
become: true
tasks:
- name: Update APT cache on Debian family
apt:
update_cache: true
when: ansible_facts['os_family'] == "Debian"
<pre class="brush:php;toolbar:false;">- name: Upgrade all packages on Debian family
apt:
upgrade: dist
autoremove: true
autoclean: true
when: ansible_facts['os_family'] == "Debian"
- name: Upgrade all packages on RedHat family
dnf:
name: "*"
state: latest
when: ansible_facts['os_family'] == "RedHat"
执行命令:ansible-playbook update-packages.yml
增强可控性的实用技巧
- 加 --limit 分批执行,例如只更新前 5 台:ansible-playbook update-packages.yml --limit 5
- 加 --tags 跳过某类任务,比如暂不升级内核:ansible-playbook ... --tags "no-kernel"
- 加 --check 预演(dry-run),查看哪些包会被更新而不实际执行
- 若需自动重启(如内核更新后),可在 task 后追加 reboot 模块,并设置 reboot_timeout
- 敏感环境建议启用 vault 加密变量,如升级白名单或排除列表











