CentOS7 无外网环境下部署Ansible:三种主流离线方案深度解析与实战
1. 为什么需要离线部署Ansible?
在企业生产环境中,服务器通常处于内网隔离状态,无法直接访问互联网。这时候如果需要在多台服务器上批量部署应用或执行运维任务,Ansible无疑是最佳选择之一。但问题来了:Ansible本身需要联网安装依赖包,这就形成了一个"先有鸡还是先有蛋"的困境。
我遇到过不少运维工程师,他们习惯性地在每台服务器上手动操作,不仅效率低下,还容易出错。其实通过以下三种成熟的离线部署方案,完全可以打破这个僵局:
- pip离线包方案:适合已有Python环境且需要灵活控制版本
- RPM本地源方案:最接近在线安装体验,适合批量部署
- 便携式Ansible:即开即用,适合临时任务和受限环境
这三种方案我都实际在生产环境验证过,接下来会详细解析每种方法的适用场景和具体操作步骤。先来看下基础环境要求:
# 系统版本确认 cat /etc/redhat-release # Python版本确认 python --version # 内核版本 uname -r2. 方案一:pip离线包部署
2.1 准备工作
这个方法的核心思路是:在一台能联网的机器上打包所有依赖,然后复制到目标服务器。我建议使用与生产环境相同的CentOS版本准备离线包,避免兼容性问题。
# 在联网机器上创建工作目录 mkdir -p /opt/ansible_offline cd /opt/ansible_offline # 安装必要工具 yum install -y python3 python3-pip wget # 下载requirements文件 wget https://raw.githubusercontent.com/kubernetes-sigs/kubespray/release-2.16/requirements.txt2.2 打包依赖
这里有个小技巧:使用pip download代替pip install可以只下载不安装。我遇到过有人直接pip install再打包site-packages,这种做法会导致包版本冲突。
# 下载所有依赖包 pip3 download -r requirements.txt # 额外下载常用模块 pip3 download netaddr jmespath passlib2.3 离线安装
将打包好的目录拷贝到目标服务器后:
# 安装基础依赖 rpm -ivh python3-*.rpm # 离线安装pip包 pip3 install --no-index --find-links=. -r requirements.txt # 验证安装 ansible --version常见踩坑点:
- 如果提示缺少libffi等底层依赖,需要先安装
yum install libffi-devel - Python版本不匹配会导致奇怪的报错,务必保持版本一致
- 磁盘空间不足时下载会失败,建议预留至少500MB空间
3. 方案二:RPM本地源部署
3.1 创建本地仓库
这种方法最适合批量部署,我曾在50+节点的集群中成功应用。关键是要建立完整的本地YUM仓库。
# 安装必要工具 yum install -y createrepo yum-utils # 下载Ansible及所有依赖 mkdir /opt/local_repo yum install -y epel-release yumdownloader --resolve --destdir=/opt/local_repo ansible # 创建仓库元数据 createrepo /opt/local_repo3.2 配置本地源
将整个仓库目录打包复制到目标服务器后:
# 创建repo文件 cat > /etc/yum.repos.d/local.repo <<EOF [local] name=Local Repository baseurl=file:///opt/local_repo enabled=1 gpgcheck=0 EOF # 清理缓存 yum clean all3.3 安装验证
# 安装Ansible yum install -y ansible # 验证 ansible --version性能优化技巧:
- 使用Nginx搭建HTTP仓库比file协议快3倍
- 配合
reposync可以镜像整个远程仓库 - 定期运行
createrepo --update保持元数据最新
4. 方案三:便携式Ansible
4.1 获取便携版
当遇到严格受限的环境时,便携版就是救命稻草。我曾在客户现场用这个方法快速搭建临时运维环境。
# 下载便携版 wget https://github.com/ownport/portable-ansible/releases/download/v0.4.0/portable-ansible-v0.4.0-py3.tar.bz2 # 解压 tar xjf portable-ansible-v0.4.0-py3.tar.bz24.2 配置使用
# 设置环境变量 export PATH=$PATH:$(pwd)/ansible/bin # 创建快捷方式 ln -s $(pwd)/ansible/bin/ansible-playbook /usr/local/bin/ # 验证 ansible-playbook --version使用限制:
- 部分模块需要额外依赖
- 插件扩展性较差
- 性能略低于原生安装
5. 三种方案对比
| 维度 | pip方案 | RPM方案 | 便携版 |
|---|---|---|---|
| 安装复杂度 | 中等 | 简单 | 极简 |
| 依赖管理 | 需手动处理 | 自动解决 | 内置 |
| 升级难度 | 较困难 | 容易 | 需重新下载 |
| 磁盘占用 | 较大(300MB+) | 中等(200MB) | 小(80MB) |
| 适用场景 | 开发环境 | 生产环境 | 应急使用 |
6. 进阶配置技巧
6.1 离线安装常用模块
即使离线环境,也能扩展功能:
# 下载模块包 pip3 download docker-py netaddr # 离线安装 pip3 install --no-index --find-links=. docker-py netaddr6.2 自定义配置文件
# 生成默认配置 mkdir /etc/ansible ansible-config init --disabled > /etc/ansible/ansible.cfg # 优化设置 sed -i 's/#host_key_checking/host_key_checking/' /etc/ansible/ansible.cfg6.3 SSH免密配置
# 生成密钥 ssh-keygen -t rsa -b 4096 -f /root/.ssh/ansible_id # 分发公钥 for host in node{1..10}; do ssh-copy-id -i /root/.ssh/ansible_id.pub $host done7. 排错指南
问题1:提示"No module named 'yaml'
解决:安装PyYAMLpip3 install PyYAML
问题2:SSH连接超时
解决:检查/etc/ansible/ansible.cfg中的超时设置
问题3:sudo权限失败
解决:在playbook中配置become参数:
- hosts: all become: yes tasks: - name: Ensure nginx is installed yum: name: nginx state: present实际部署中,RPM方案的综合表现最稳定,特别适合大规模集群。而便携版虽然方便,但长期使用可能会遇到模块缺失的问题。建议根据具体场景灵活选择,必要时可以组合使用。