教材原文:RHCA 官方英文教材(教材第 503~531 页)(OCR 整书版已从本站移除,本页为章节精读) 章节结构:14.1 Performing Basic Troubleshooting of Ansible Tower(含 GE:admin-troubleshoot)→ 14.2 Configuring TLS/SSL for Ansible Tower(含 GE:admin-cert)→ 14.3 Backing Up and Restoring Ansible Tower(含 GE:admin-recovery)→ Quiz(Maintaining Ansible Tower) 关联知识:Ch6(Tower 安装架构)、Ch11(API)、Ch12(awx-manage inventory_import 同工具)、06-RedHat-RHCE-RHCA-目录梳理与课程地图(Tower 即 AWX 商用版)
- GOAL: Perform routine maintenance and administration of Ansible Tower.(对 Ansible Tower 做例行维护与管理)
- OBJECTIVES:① 描述 Tower 底层组件、定位并检查相关日志、控制 Tower 服务、做基本排障;② 用 CA 签发的新证书替换 Tower 默认 TLS 证书;③ 备份/恢复 Tower 数据库与配置文件。
- SECTIONS:Performing Basic Troubleshooting(含 GE)、Configuring TLS/SSL(含 GE)、Backing Up and Restoring(含 GE);QUIZ:Maintaining Ansible Tower。
| 组件 | 作用 |
|---|
| Nginx | 承载 Tower 应用的 Web 服务器,支撑 Web UI 与 API |
| PostgreSQL | 数据库,存 Tower 大部分数据、配置与历史记录 |
| Supervisord | 进程控制系统,管理 Tower 应用各组件(调度/运行作业、监听运行中作业的回调等) |
| rabbitmq-server | AMQP 消息代理,为 Tower 应用组件提供信令(signaling) |
- 第五个组件:memcached(内存对象缓存守护进程),作本地缓存服务。
- 组件间用常规网络协议通信;对外只需暴露 80/tcp 与 443/tcp(Web UI/API)。其余服务默认可能对外监听:PostgreSQL 5432/tcp(任意来源)、RabbitMQ beam 5672/15672/25672/tcp——仅本机 Tower 服务需要时应以本地防火墙封禁。
- WARNING(考点):安装用 inventory 文件里 PostgreSQL/RabbitMQ 的密码要设强(
pg_password、rabbitmq_password);默认这些服务可被外网直连,弱密码易受远程攻击。
- 系统自带脚本
/usr/bin/ansible-tower-service {start|stop|restart|status}:可启停/重启/查看 Tower 主要服务(含数据库与消息队列)。裸跑无参数会打印用法。 - 底层仍走 systemd 单元:postgresql.service、rabbitmq-server.service、nginx.service、supervisord.service。
- supervisorctl status 查看 supervisord 管理的 Tower 进程(均属 awx 用户):
exit-event-listener、tower-processes:awx-callback-receiver、awx-celeryd(实时分布式消息任务/作业队列)、awx-celeryd-beat、awx-channels-worker、awx-daphne、awx-uwsgi。
- 配置主目录
/etc/tower:含应用设置(PostgreSQL 库之外的配置)、nginx 用的 TLS 证书、其它密钥文件。最重要的是 /etc/tower/settings.py——指定 job 输出、项目存储等目录位置。Nginx 自身配置在 /etc/nginx(nginx.conf)。 - 日志集中在两处:
/var/log/tower:tower.log(应用主日志);setup*.log(setup.sh 安装/备份/恢复日志);task_system.log(系统杂务,如清理旧作业记录)。/var/log/supervisor:supervisord.log(主日志)+ 各 daemon 的活动日志。
- 外部日志聚合(可选):Splunk、Elastic stack/logstash(旧称 ELK)、Loggly、Sumologic。
- IMPORTANT(排障方向,考点):跑 playbook 出错时若与 Tower 配置无关,先看 Web UI/API 里作业输出,而不是死磕服务器日志。
- 其它关键文件
/var/lib/awx:public/static(Django 应用静态文件)、projects(项目根目录,Git 拉取文件存这)、job_status(playbook 作业状态输出)。
| 现象 | 检查项 |
|---|
| 跑 playbook 出问题 | 默认把 playbook 限制在 /tmp 并限制其在 Tower 服务器本地的访问(影响 delegate 到本机的任务);检查 license 状态与受管唯一主机数(license 过期/主机超额→无法启动作业) |
| 连不上目标主机 | 确认能 SSH(或 Windows WinRM)连受管主机;复查 inventory 主机名/IP |
| playbook 不出现在 Job Template 列表 | playbook YAML 能被 Ansible 解析;/var/lib/awx/projects/ 权限/属主正确(awx 用户可读) |
| 作业一直 Pending | 内存充足、supervisord 各进程在跑(supervisorctl status);/var 所在分区剩余 >1GB;ansible-tower-service restart |
Skipping: No Hosts Matched | hosts 模式大小写敏感、与组/主机名匹配;组名别带空格;Job Template 的 limit 有效且命中 inventory |
awx-manage 访问 Tower 内部详细数据,必须以 root 或 awx 用户运行;最常用途:重置 admin 密码、导入存量静态清单(Ch12 已见 inventory_import)。- 改 admin 密码:
awx-manage changepassword admin(交互两次输入)。 - 新建超级用户:
awx-manage createsuperuser(可建额外系统管理员账号)。
- Web UI 访问报 “Server Error” →
ssh root@tower。 firewall-cmd --list-ports 显示 80/443 未封(与“能收到响应”吻合)。ansible-tower-service status → postgresql.service 为 inactive (dead),记下停掉时间(如 Wed 2018-11-21 04:20:43)。ansible-tower-service restart 拉起全部服务 → Web UI 恢复可登录。- 追查 PostgreSQL 为何停:
systemctl status postgresql -l 提示日志在 pg_log → find / -name pg_log → /var/lib/pgsql/data/pg_log → less postgresql-Wed.log 见 “received fast shutdown request … database system is shut down” ⇒ 是被人手动停的。 - supervisord 日志:
cd /var/log/supervisor && tail -n 50 supervisord.log(看到 stop/spawn 各 awx 进程)。 - Tower 日志联动:
grep job_templates /var/log/tower/tower.log 看到 admin 从 172.25.250.9 访问 /api/v1/job_templates/55555/launch/ 得 404(试图启动不存在的模板);grep 55555 /var/log/nginx/access.log 有同时间 POST 404 记录 ⇒ 三层日志(tower.log + nginx access.log)对同一事件的排障示范。 - 第二部分:
awx-manage createsuperuser(admin2/redhat)→ awx-manage changepassword admin2(改 redhat2)→ 退出 ssh → Web UI 用 admin2/redhat2 登录验证。 lab admin-troubleshoot finish。
- Tower Web UI 由 Tower 机上的 Nginx 提供;安装时生成自签名 TLS 证书+私钥供 HTTPS 用。
- Nginx 主配置
/etc/nginx/nginx.conf;访问日志 /var/log/nginx/access.log、错误日志 /var/log/nginx/error.log(会被轮转+gzip)。 - 一般无需改 nginx.conf;但两类场景要知道 TLS 配置在哪:① 换 CA 签名证书;② 调整 TLS 配置(如移除有漏洞算法的 cipher)。
- TLS 配置在 nginx.conf 的 server 块(listen 443 default_server ssl):
ssl_certificate /etc/tower/tower.cert;、ssl_certificate_key /etc/tower/tower.key;;ssl_protocols TLSv1.2;、ssl_ciphers 'ECDHE-...';、ssl_prefer_server_ciphers on; 等(教材示例为 intermediate 配置)。
- 取得 CA(公网 CA 或内网企业 CA)正确签名的服务器证书 + 匹配私钥,均 PEM 格式。
- 证书存到
/etc/tower/tower.cert、私钥存到 /etc/tower/tower.key。 - 两文件必须属主 awx、属组 awx、权限 600(
-rw-------. 1 awx awx …)。 ansible-tower-service restart。- 用信任该 CA 的浏览器访问验证:证书详情正确、无安全告警。
- IMPORTANT(实验室语境,考点):教室用 FreeIPA 作 CA,
ipa-getcert 申请证书由 certmonger 自动续期。但 Ansible Tower 3.3.1 把 /etc/tower 下文件标成 etc_t SELinux 类型,FreeIPA 工具要能管理 tower.cert/tower.key 需标成 cert_t(Nginx 可正常读 cert_t 证书):semanage fcontext -a -t cert_t "/etc/tower/tower\.(.*)"(fcontext 存系统策略),再 restorecon -FvvR /etc/tower/ 修正现场上下文;semanage 由 policycoreutils-python 包提供。
lab admin-cert start → ssh root@tower。semanage fcontext -a -t cert_t "/etc/tower(/.*)?" + restorecon -FvvR /etc/tower/(让 certmonger 能写这两个文件)。- 备份再删旧证书:
cp /etc/tower/tower.* /root → rm /etc/tower/tower.*。 ipa-getcert request -f /etc/tower/tower.cert -k /etc/tower/tower.key(向 utility 的 FreeIPA CA 为 tower.lab.example.com 申请)。ansible-tower-service restart 退出 ssh。- 浏览器打开 https://tower.lab.example.com:无证书告警;点锁图标可见主机名 tower.lab.example.com 与组织 LAB.EXAMPLE.COM。
lab admin-cert finish。
- 手工备份/恢复能力集成在 Tower 安装程序里(同一份 setup.sh + inventory 文件)。
- 备份:在安装目录以 root 执行
./setup.sh -b,生成 tower-backup-DATE.tar.gz(DATE 形如 2017-03-29-08:34:43)并创建软链 tower-backup-latest.tar.gz(默认恢复用指向最新备份)。 - 备份内容:
tower.db(PostgreSQL 数据库 dump)、./conf(/etc/tower 配置目录内容)、./job_status(作业输出目录)、./projects(手工项目目录)、./static(Web UI 定制,如自定义 logo)。 - IMPORTANT 三条(考点):① 只生成归档,自行安排定期执行并异地安全存放;② 恢复需同一版本安装包;③ 备份的是配置与数据库,不含日志与安装的程序;若删了安装目录,解包同版本 tar、并在 inventory 里填当前服务密码(admin_password/pg_password/rabbitmq_password)及其它改动。
- 恢复:
./setup.sh -r(root、安装目录)。需要:备份归档 + 同版本安装器 + inventory。多备份时要让 tower-backup-latest.tar.gz 指向想恢复的那份(删旧软链重建)。 - WARNING:别忘 -r——不带会从零开始新安装;真发生了就等装完再恢复备份。
lab admin-recovery start → ssh root@tower;ls /root 见 ansible-tower-setup-bundle-3.5.0-1.el8。ansible-tower-service status 确认服务正常 → 进安装目录。./setup.sh -b → 目录出现 tower-backup-2019-06-20-07:04:57.tar.gz 与 tower-backup-latest.tar.gz。awx-manage changepassword admin(改成 redhat2)→ Web UI 用 redhat2 登录再退出。./setup.sh -r 恢复(不带 -r 会变新装)→ Web UI 用旧密码 redhat 能登录 ⇒ 数据库与配置已回滚到备份点。lab admin-recovery finish。
- 查 Tower 服务状态的命令?→
ansible-tower-service status(a. firewall-cmd、b. systemctl status ansible-tower、d. service tower status 均不对)。 - 改 Tower admin 密码?→
awx-manage changepassword admin(createsuperuser 只能新建,不能改密)。 - Tower TLS 证书文件默认位置在哪?→ 文件在 /etc/tower/tower.cert(由 /etc/nginx/nginx.conf 的 server 块 ssl_certificate 指向;注意题干问“certificate 的位置”选文件路径)。
- Tower 默认日志目录?→ /var/log/tower。
- Tower 由四个主网络服务组成:Nginx(Web)、PostgreSQL(数据库)、supervisord(进程控制)、rabbitmq-server(消息代理)。(+memcached 缓存)
- 用
ansible-tower-service 手动停/启/重启 Tower 服务。 - 日志在
/var/log/tower 与 /var/log/supervisor。 - 换 TLS:替换
/etc/tower/tower.cert 与 /etc/tower/tower.key 即可自定义证书。 - 备份:安装脚本
setup.sh -b 可备份数据库、配置文件、本地项目与作业输出。
| 命令/文件 | 用途 |
|---|
ansible-tower-service {start|stop|restart|status} | 控制 Tower 四大服务(含 DB/消息队列) |
supervisorctl status | 查看 supervisord 管的 awx 进程 |
/etc/tower/settings.py | Tower 应用主配置(目录位置等) |
/var/log/tower/tower.log | 应用主日志(作业/清单变更记录) |
/var/log/tower/setup*.log | 安装/备份/恢复日志 |
/var/log/tower/task_system.log | 系统杂务日志(清旧作业记录等) |
/var/log/supervisor/supervisord.log | supervisord 主日志 |
/var/lib/awx/{static,projects,job_status} | Django 静态/项目根/作业输出 |
/var/log/nginx/{access,error}.log | Nginx 访问/错误日志 |
firewall-cmd --list-ports | 查端口放行(80/443 应开) |
awx-manage changepassword <user> | 命令行改用户密码(root/awx 用户跑) |
awx-manage createsuperuser | 新建 Tower 超级用户 |
/etc/nginx/nginx.conf(ssl_certificate 指令) | 定义 TLS 证书/私钥位置与 cipher |
/etc/tower/tower.cert、/etc/tower/tower.key | TLS 证书/私钥(属主 awx:awx、600) |
semanage fcontext -a -t cert_t ... + restorecon -FvvR /etc/tower/ | 给证书文件设 cert_t SELinux 类型 |
ipa-getcert request -f <cert> -k <key> | 向 FreeIPA CA 申请证书(certmonger 续期) |
./setup.sh -b | 备份(生成 tower-backup-*.tar.gz + latest 软链) |
./setup.sh -r | 从 latest 备份恢复(忘 -r=全新安装) |
| 英文 | 中文速记 |
|---|
| nginx / postgresql / supervisord / rabbitmq | Tower 四大组件(Web/DB/进程控制/AMQP) |
| memcached | 内存对象缓存(第五组件) |
| AMQP message broker | RabbitMQ 消息代理(组件信令) |
| ansible-tower-service | Tower 服务控制脚本 |
| supervisorctl / supervisord | 进程控制系统及其客户端 |
| awx user / awx group | Tower 应用运行用户(进程与文件属主) |
| awx-celeryd | 实时分布式作业队列 daemon |
| tower.log / supervisord.log | 应用/supervisor 主日志 |
| log aggregation | 日志聚合(Splunk/ELK/Loggly/Sumologic) |
| settings.py | Tower 应用配置(目录路径) |
| self-signed certificate | 自签名证书(安装默认) |
| ssl_certificate / ssl_certificate_key | nginx 证书/私钥指令 |
| PEM format | 证书私钥格式(替换要求) |
| cert_t / etc_t(SELinux) | 证书文件所需/默认类型 |
| ipa-getcert / certmonger | FreeIPA 证书申请工具/自动续期守护 |
| setup.sh -b / -r | 备份 / 恢复(同版本安装器) |
| tower-backup-latest.tar.gz | 默认恢复指向的软链 |
- 列出 Tower 四大核心服务并各用一句话说明职责;memcached 起什么作用?
- 对外只需开哪两个端口?PostgreSQL/RabbitMQ 默认还监听哪些端口,为什么要在防火墙处理?装 Tower 时哪两个密码必须设强?
- 一条命令查 Tower 服务状态、一条命令看 supervisord 管的进程、一条命令重启整套 Tower 基础设施?
- Tower 配置目录与两个日志目录分别是什么?tower.log/setup*.log/task_system.log 各记录什么?
- 跑 playbook 报错时应先看哪里?什么场景下才去翻服务器日志?
- 依次说出“作业一直 Pending”“No Hosts Matched”“playbook 不出现于模板列表”三个场景各查什么。
- awx-manage 必须由谁运行?改密码与建超管分别用什么子命令?
- 换 TLS 证书的完整步骤(含文件属主权限、重启、验证)?为什么要在 fcontext 里把 tower.cert/key 标成 cert_t?
- setup.sh -b 的备份包里包含哪 5 项?不包含什么?为什么恢复要求“同版本安装器 + 当前密码的 inventory”?
- 恢复时忘了 -r 会怎样?多个备份时怎样指定恢复某一旧备份?