目录
1 包管理模块概述
在Linux系统自动化运维中,软件包管理是最基础也是最频繁的操作之一。Ansible针对不同的Linux发行版提供了专门的包管理模块,其中yum和apt是两个最核心的模块,分别服务于RedHat系和Debian系的系统。
1.1 为什么需要专门的包管理模块
Linux系统软件管理面临几个挑战:
- 发行版差异:不同发行版使用不同的包管理系统(RPM vs DEB)
- 依赖关系:软件包之间存在复杂的依赖关系
- 仓库管理:需要配置和维护软件源
- 版本控制:需要精确控制软件版本
- Ansible的包管理模块通过统一抽象的接口解决了这些问题:
- name: 在RedHat系系统上安装软件
yum:
name: httpd
state: present
- name: 在Debian系系统上安装软件
apt:
name: apache2
state: present
2 yum模块深度解析
2.1 yum模块工作原理

- 状态检查:检查目标软件包是否已安装且版本是否符合要求
- 依赖解析:分析并解决软件包依赖关系
- 包下载:从配置的仓库下载所需软件包
- 完整性验证:检查软件包签名和校验和
- 安装执行:实际安装软件包及其依赖
- 结果验证:确认安装是否成功完成
2.2 yum模块核心参数
2.2.1 name
- 作用:指定软件包名称
- 特点:
- 可以接受单个包名或列表
- 支持通配符和版本限定
- name: 安装多个软件包
yum:
name:
- httpd
- mod_ssl
state: latest
2.2.2 state
常用值:
- present或installed:确保安装
- latest:确保最新版本
- absent或removed:确保卸载
- clean:清理缓存
- name: 确保安装特定版本
yum:
name: "docker-ce-19.03.15"
state: present
2.2.3 enablerepo/disablerepo
- 作用:临时启用/禁用特定仓库
- 典型应用:测试新版本或从特定源安装
- name: 从测试仓库安装
yum:
name: "new-package"
enablerepo: "testing"
state: latest
2.3 yum模块高级用法
2.3.1 事务性操作
- name: 事务性安装一组软件
yum:
name: "@development-tools"
state: present
2.3.2 本地安装
- name: 从本地rpm安装
yum:
name: "/tmp/custom-package.rpm"
state: present
3 apt模块深度解析
3.1 apt模块工作原理

- 自动更新索引:默认会先执行apt-get update
- 配置处理:自动处理debconf配置
- 自动修复:尝试自动修复损坏的依赖关系
3.2 apt模块核心参数
3.2.1 update_cache
- 作用:控制是否先更新包索引
- 默认:yes(与yum不同)
- 优化建议:在playbook开头统一更新
- name: 不更新缓存直接安装
apt:
name: nginx
update_cache: no
3.2.2 autoremove
- 作用:自动移除不再需要的依赖
- 典型应用:系统清理维护
- name: 清理不需要的包
apt:
autoremove: yes
3.2.3 deb
- 作用:安装本地deb文件
- 注意:不会自动解决依赖
- name: 安装本地deb包
apt:
deb: "/tmp/custom.deb"
3.3 apt模块高级用法
3.3.1 固定版本
- name: 安装特定版本
apt:
name: "docker-ce=5:20.10.7~3-0~ubuntu-focal"
state: present
3.3.2 策略模式
- name: 配置自动更新
apt:
upgrade: dist
autoremove: yes
4 yum与apt模块对比
4.1 功能对比表
特性 |
yum模块 |
apt模块 |
默认更新缓存 |
否 |
是 |
通配符支持 |
是 |
否 |
组包操作 |
支持(@前缀) |
支持(task前缀) |
本地安装 |
支持 |
支持 |
自动修复依赖 |
是 |
是 |
版本锁定 |
支持 |
支持 |
4.2 跨平台兼容方案
- 使用package模块实现跨平台兼容:
- name: 跨平台安装软件
package:
name: "{{ 'httpd' if ansible_os_family == 'RedHat' else 'apache2' }}"
state: present
5 生产环境实践建议
5.1 仓库管理
5.1.1 yum仓库配置
- name: 配置EPEL仓库
yum_repository:
name: epel
description: EPEL YUM repo
baseurl: https://mirrors.aliyun.com/epel/$releasever/$basearch/
gpgcheck: yes
gpgkey: https://mirrors.aliyun.com/epel/RPM-GPG-KEY-EPEL-$releasever
5.1.2 apt仓库配置
- name: 配置Docker仓库
apt_repository:
repo: "deb [arch=amd64] https://download.docker.com/linux/ubuntu {{ ansible_distribution_release }} stable"
state: present
update_cache: yes
5.2 安全实践
5.2.1 GPG密钥验证
- name: 安全安装
apt:
name: "some-package"
allow_unauthenticated: no # 默认值
5.2.2 最小权限原则
- name: 非root安装
become: yes
become_user: "app_user"
apt:
name: "user-package"
state: present
6 常见问题与解决方案
6.1 依赖问题处理
6.1.1 强制安装(yum)
- name: 跳过损坏的依赖
yum:
name: "problematic-package"
skip_broken: yes
6.1.2 修复依赖(apt)
- name: 修复损坏的包
apt:
fix_broken: yes
6.2 网络问题处理
6.2.1 设置超时
- name: 设置长超时
yum:
name: "large-package"
timeout: 300
6.2.2 使用本地缓存
- name: 仅使用缓存
apt:
name: "some-package"
update_cache: no
cache_valid_time: 3600
7 性能优化技巧
7.1 批量操作
- name: 批量安装
yum:
name:
- package1
- package2
- package3
state: present
7.2 缓存控制
- name: 智能缓存更新
apt:
update_cache: "{{ ansible_date_time.weekday == 'Monday' }}"
7.3 并行下载
- name: 启用快速镜像
yum:
name: "large-package"
fastestmirror: yes
8 总结
Ansible的yum和apt模块为不同Linux发行版提供了强大的包管理能力。通过本文我们学习了解了:
- 模块原理:工作流程与内部机制
- 参数详解:从基础到高级参数
- 生产实践:仓库管理、安全配置
- 性能优化:批量操作、缓存控制
- 问题解决:依赖处理、网络问题
通过合理使用这些模块,可以构建高效、可靠的自动化部署流程,显著提升运维效率和质量。