1.4.7 批量安装与自动化包管理
批量安装与自动化包管理的目标是实现大规模主机的软件一致性、可审计与可回滚。常见做法是“包清单 + 统一仓库 + 并发执行 + 结果回收”,并在必要时结合 Ansible 等自动化工具。
1. 原理草图:批量安装流程
2. 包清单管理与生成
- 作用:定义“软件基线”,避免版本漂移
- 生成命令(带解释):
# RHEL/CentOS:导出已安装包列表
rpm -qa > /opt/baseline/pkglist.txt
# Ubuntu/Debian:导出已安装包列表
dpkg -l | awk 'NR>5{print $2}' > /opt/baseline/pkglist.txt
预期效果:/opt/baseline/pkglist.txt 中每行一个包名,可用于批量安装或基线对比。
3. 单机批量安装示例(YUM/DNF/APT)
# RHEL/CentOS
dnf install -y $(cat /opt/baseline/pkglist.txt)
# Ubuntu/Debian
xargs -a /opt/baseline/pkglist.txt apt-get install -y
命令解释:
- dnf install -y / apt-get install -y:自动确认安装
- $(cat ...) / xargs -a:将包清单按行传入安装命令
4. 多机并发安装示例(SSH + 并发)
准备主机清单:
cat >/opt/hosts.txt <<'EOF'
10.0.1.11
10.0.1.12
10.0.1.13
EOF
并发执行安装(建议小规模):
# 并发 3 台主机执行安装
cat /opt/hosts.txt | xargs -I{} -P3 ssh root@{} \
"dnf install -y $(cat /opt/baseline/pkglist.txt) && echo OK"
预期效果:终端输出每台主机的执行结果,失败节点可被捕获。
5. Ansible 自动化安装示例(推荐中大型集群)
Inventory:
# /etc/ansible/hosts
[app]
10.0.1.11
10.0.1.12
10.0.1.13
Playbook:
# /opt/ansible/pkg_install.yml
- hosts: app
become: yes
vars:
pkg_list:
- vim
- lsof
- net-tools
- bash-completion
tasks:
- name: Install packages (RHEL/CentOS)
yum:
name: "{{ pkg_list }}"
state: present
when: ansible_facts['os_family'] == "RedHat"
- name: Install packages (Ubuntu/Debian)
apt:
name: "{{ pkg_list }}"
state: present
update_cache: yes
when: ansible_facts['os_family'] == "Debian"
执行:
ansible-playbook /opt/ansible/pkg_install.yml
预期效果:幂等安装,重复执行不会重复安装。
6. 离线/内网批量安装示例
本地仓库(RHEL/CentOS):
# 生成本地仓库元数据
createrepo /opt/repo
# 配置本地仓库
cat >/etc/yum.repos.d/local.repo <<'EOF'
[local]
name=local
baseurl=file:///opt/repo
enabled=1
gpgcheck=0
EOF
预期效果:dnf install 仅从本地仓库安装,适合离线环境。
7. 安装结果校验与基线对比
# 校验包是否安装
rpm -q vim lsof net-tools
# 与基线对比(仅示意,输出差异包)
comm -3 <(sort /opt/baseline/pkglist.txt) <(rpm -qa | sort)
预期效果:comm 输出差异包,便于审计和回滚决策。
8. 常见排错(含命令)
- 依赖冲突:
dnf install -y pkgname --allowerasing
说明:允许替换冲突包,但需结合变更窗口。
- 无法解析域名/仓库不可达:
# 检查 DNS 与连通性
cat /etc/resolv.conf
ping -c 2 mirrors.aliyun.com
- 缺少 GPG 签名:
dnf install -y pkgname --nogpgcheck
说明:仅在可信内网仓库临时使用,正式环境应导入 GPG Key。
9. 练习
1. 生成当前系统包清单并保存到 /opt/baseline/pkglist.txt。
2. 在 2 台测试主机上使用 xargs -P 并发安装 vim 和 lsof。
3. 用 Ansible 写一个 playbook,分别在 RHEL 与 Ubuntu 安装相同包清单。
4. 使用 comm -3 对比安装前后包清单差异,并记录差异结果。