Docker化部署Ansible AWX:从零搭建企业级自动化运维平台
1. 为什么选择Docker化部署AWX
如果你正在寻找一个能够简化Ansible管理的工具,AWX绝对值得考虑。作为Ansible Tower的开源版本,AWX提供了图形化界面来管理你的自动化任务。而使用Docker来部署AWX,就像把整个系统装进了一个便携的集装箱里,既干净又方便。
我刚开始接触AWX时,尝试过直接在服务器上安装,结果被各种依赖关系搞得焦头烂额。后来改用Docker方式,整个过程变得出奇地简单。Docker化的AWX将所有组件(包括PostgreSQL数据库、Redis缓存、任务执行器等)打包成独立的容器,彼此隔离又相互协作。这种部署方式有三大优势:
首先,环境一致性。Docker镜像包含了AWX运行所需的所有依赖,你再也不用担心"在我的机器上能运行"的问题。我在团队内部推广时,新成员只需要拉取镜像就能获得和我完全一致的运行环境。
其次,资源隔离。每个组件运行在独立的容器中,不会互相干扰。记得有一次Redis出现问题,由于容器隔离,完全不影响其他服务正常运行。
最后,易于维护。升级或回滚就像切换镜像标签一样简单。上周我需要测试新版本,只需修改docker-compose文件中的镜像版本号,几分钟就完成了升级。
2. 部署前的准备工作
2.1 硬件与系统要求
在开始之前,确保你的服务器满足以下最低配置:
- CPU:至少4核(AWX任务执行时会占用较多CPU资源)
- 内存:8GB以上(我实测4GB也能运行,但执行复杂playbook时会很卡)
- 磁盘空间:50GB可用空间(数据库和日志会逐渐占用空间)
- 操作系统:我推荐使用CentOS 7/8或Ubuntu 18.04/20.04 LTS
我的生产环境使用的是AWS的t3.xlarge实例(4核16GB内存),运行20多个定时任务毫无压力。如果是测试环境,用本地虚拟机也可以,但要注意分配足够资源。
2.2 安装Docker和Docker Compose
AWX运行需要Docker和Docker Compose。以下是安装步骤:
# 安装Docker curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun systemctl enable --now docker # 安装Docker Compose version=1.29.2 curl -L https://get.daocloud.io/docker/compose/releases/download/${version}/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose # 验证安装 docker --version docker-compose --version这里有个小技巧:如果你在国内,使用阿里云镜像源可以显著加快下载速度。我曾经因为网络问题浪费了半天时间,后来才发现是下载源的问题。
2.3 其他依赖项
AWX安装程序是用Ansible编写的,所以需要先安装Ansible:
yum install -y epel-release # CentOS yum install -y ansible python3-pip # 或者Ubuntu apt update apt install -y ansible python3-pip安装完成后,建议测试下Ansible是否正常工作:
ansible --version3. 部署AWX核心组件
3.1 获取AWX安装包
从GitHub下载最新版AWX(本文以18.0.0为例):
wget https://github.com/ansible/awx/archive/18.0.0.tar.gz tar -zxvf 18.0.0.tar.gz cd awx-18.0.0/installer/3.2 配置inventory文件
inventory文件是AWX安装的核心配置文件,位于installer目录下。打开它进行修改:
vim inventory关键配置项包括:
postgres_data_dir:PostgreSQL数据目录host_port:Web界面访问端口(默认80)admin_user和admin_password:管理员账号secret_key:用于加密的密钥
我建议至少修改以下参数:
postgres_data_dir=/var/lib/awx/pgdocker host_port=8080 # 避免与现有80端口冲突 admin_password=YourStrongPasswordHere3.3 执行安装
运行Ansible playbook开始安装:
ansible-playbook -i inventory install.yml这个过程通常需要10-30分钟,取决于你的网络速度。我第一次安装时因为没耐心等待,误以为卡住中断了进程,结果导致各种奇怪错误。建议泡杯咖啡耐心等待。
安装完成后,检查容器状态:
docker-compose -f /root/.awx/awxcompose/docker-compose.yml ps应该看到4个容器(web、task、redis、postgres)都处于运行状态。
4. 初始配置与验证
4.1 访问AWX Web界面
在浏览器中输入服务器IP和配置的端口(如http://your-server-ip:8080),使用之前设置的管理员账号登录。
第一次登录后,我强烈建议:
- 立即修改默认密码
- 配置SMTP设置(后续通知会用到)
- 设置系统名称和公司信息
4.2 创建第一个凭证
凭证是AWX连接被管理节点的关键。点击"Credentials"→"Add"创建新凭证:
- SSH类型:适用于Linux服务器
- 机器类型:用于节点认证
- 用户名/密码或SSH私钥:选择适合你的认证方式
我习惯使用SSH密钥认证,更安全方便。先在AWX服务器生成密钥对:
ssh-keygen -t rsa -b 4096然后将公钥复制到目标节点:
ssh-copy-id user@target-host最后在AWX中添加私钥凭证。
4.3 创建Inventory
Inventory定义了你要管理的主机。可以手动添加,也可以从文件或脚本导入。
我常用的方式:
- 创建"Production"和"Development"两个inventory
- 按功能分组(如web-servers、db-servers)
- 为每组主机设置变量
[web-servers] web1 ansible_host=192.168.1.101 web2 ansible_host=192.168.1.102 [db-servers] db1 ansible_host=192.168.1.201 db2 ansible_host=192.168.1.202 [web-servers:vars] ansible_user=deploy4.4 测试连接
创建好inventory和凭证后,可以测试连接是否正常:
- 在inventory页面选中主机组
- 点击"Run Command"
- 选择"ping"模块
- 选择对应的凭证
- 点击"Launch"
如果看到绿色的"success"状态,恭喜你,基础配置完成了!
5. 高级配置与优化
5.1 配置Git集成
AWX最强大的功能之一是直接集成Git仓库中的playbook。我推荐使用Git而不是本地playbook,因为:
- 版本控制:可以回滚到任意版本
- 协作开发:团队可以共同维护playbook
- 自动同步:AWX可以定期拉取最新变更
配置步骤:
- 创建新Project
- 选择"Git"作为源类型
- 输入仓库URL(支持HTTP/SSH)
- 如果需要认证,添加Git凭证
- 设置自动同步间隔(如每30分钟)
# 示例Git仓库配置 https://github.com/your-org/ansible-playbooks.git5.2 设置任务模板
任务模板(Template)是AWX的核心概念,它定义了如何执行playbook。创建模板时要注意:
- 关联正确的Project和Inventory
- 选择合适的凭证
- 设置合理的超时时间
- 配置必要的环境变量
我通常会为每个playbook创建单独的模板,并添加描述说明用途和参数。
5.3 配置通知
AWX支持多种通知方式(Email、Slack、Webhook等)。配置SMTP示例:
- 进入"Administration"→"Notification Templates"
- 添加Email通知模板
- 填写SMTP服务器信息
- 测试发送
然后在任务模板中关联通知,这样任务成功或失败时都会收到提醒。
5.4 性能优化建议
随着使用深入,你可能会遇到性能问题。以下是我总结的优化经验:
数据库优化:定期清理旧作业记录
# 在PostgreSQL容器中执行 vacuum full;资源限制:为容器设置资源限制
# 修改docker-compose.yml web: deploy: resources: limits: cpus: '2' memory: 4G日志轮转:配置日志文件大小限制
# 修改inventory文件 awx_task_log_rotate_max_size_mb=100
6. 备份与恢复
6.1 定期备份策略
AWX的数据主要存储在PostgreSQL数据库中,备份方法:
# 进入PostgreSQL容器 docker exec -it awx_postgres bash # 执行备份 pg_dump -U awx awx > /tmp/awx_backup_$(date +%Y%m%d).sql # 将备份文件复制到宿主机 docker cp awx_postgres:/tmp/awx_backup_20230601.sql /backup/我设置了一个cron任务每周自动执行备份,并保留最近4周的备份。
6.2 恢复AWX数据
如果需要恢复:
# 将备份文件复制回容器 docker cp /backup/awx_backup_20230601.sql awx_postgres:/tmp/ # 进入容器执行恢复 docker exec -it awx_postgres bash psql -U awx awx < /tmp/awx_backup_20230601.sql6.3 完整迁移步骤
要将AWX迁移到新服务器:
- 在原服务器备份数据库
- 在新服务器安装Docker和依赖
- 部署相同版本的AWX
- 停止新服务器的AWX服务
- 恢复数据库备份
- 启动服务
记得测试所有功能是否正常,特别是定时任务和通知。
7. 常见问题排查
7.1 安装失败问题
问题:执行install.yml时卡住或报错
解决步骤:
- 检查inventory文件是否有语法错误
- 确保服务器能访问外网(特别是Docker Hub)
- 查看详细日志:
ansible-playbook -i inventory install.yml -vvv
7.2 Web界面无法访问
可能原因:
- 端口冲突
- 防火墙阻止
- 容器未正常运行
排查命令:
# 检查端口监听 netstat -tulnp | grep 8080 # 检查防火墙 firewall-cmd --list-ports # CentOS ufw status # Ubuntu # 检查容器日志 docker logs awx_web7.3 任务执行失败
典型错误:
- 凭证无效
- Inventory主机不可达
- Playbook语法错误
调试方法:
- 在任务详情页面查看完整输出
- 尝试手动执行playbook:
ansible-playbook -i inventory playbook.yml - 检查目标主机的/var/log/secure日志(SSH问题)
7.4 性能下降处理
现象:界面响应慢,任务排队
优化措施:
- 增加任务容器数量:
# 修改inventory awx_task_workers=4 - 升级服务器配置
- 清理旧作业数据
8. 生产环境最佳实践
8.1 高可用部署
对于关键业务环境,建议采用高可用架构:
- 数据库:使用外部PostgreSQL集群
- Redis:配置哨兵模式
- AWX节点:部署多个实例,前面加负载均衡
# 示例inventory配置 postgres_host=postgres-ha.example.com redis_host=redis-sentinel.example.com8.2 安全加固
安全措施包括:
- 启用HTTPS(使用Nginx反向代理)
- 配置LDAP/AD集成
- 定期更新AWX版本
- 限制管理访问IP
# 生成自签名证书 openssl req -x509 -nodes -days 365 -newkey rsa:2048 \ -keyout /etc/nginx/ssl/awx.key -out /etc/nginx/ssl/awx.crt8.3 监控与告警
建议监控:
- 容器状态(使用cAdvisor或Prometheus)
- 数据库性能
- 任务队列长度
# 示例Prometheus配置 - job_name: 'awx' static_configs: - targets: ['awx-server:8052']8.4 版本升级策略
升级步骤:
- 备份数据库
- 查看官方Release Notes
- 测试环境验证
- 生产环境滚动升级
# 修改inventory中的版本号 docker_compose_version=18.0.0