-
OS 版本:CentOS Linux release 7.4.1708 (Core)
-
Ansible 版本:
2.9.3
-
Ansible Tower 版本:
3.6.3
-
该文档中 Red Hat Ansible Tower 简称为
Ansible Tower
-
👉 该示例仅使用单节点部署 Ansible Tower,并未使用
Ansible Tower HA Cluster
。
关于 Ansible Tower HA Cluster 的部署可参见文末参考链接。
-
系统环境说明
-
Ansible Tower 概述
-
Ansible Tower 的部署架构
-
Ansible Tower 安装要求
-
Ansible Tower 安装部署与验证
-
Ansible Tower 常见故障排查
-
参考链接
-
节点硬件资源与角色:2 CPU、4G RAM、40G Disk
-
用户说明:
admin
(sudo)为 Ansible Tower 管理员与系统管理员 -
Ansible 版本:ansible 2.9.3
-
Ansible Tower 版本:ansible-tower-3.6.3-1.el7at.x86_64
-
Ansible 的优点在于它是去中心化的工具,可以直接通过 ssh 管理远程主机,实现无
Agent
的部署(ssh + python 环境已经原生集成在 Linux 中)。 -
💥 Ansible 的缺点也在于其去中心化的特点,本身不支持高可用和分布式架构,无法实现
Server-Proxy-Client
的架构,在比较复杂或者多区域的网络区域中,无法实现统一的集中式管理(如多个 ansible 管理端的配置同步),也没有前端UI
,对 ansible 的技能要求比较高。 -
Red Hat 为 Ansible 提供了一个
Web UI
,即Ansible Tower
,使用它可以免费管理10
台以内的主机。 -
Ansible Tower 是
Django
Web 应用,可在 Linux 服务器上作为企业内自托管方案运行,架设于企业的现有 Ansible 基础架构之上。 -
用户通过 Ansible Tower 的
Web UI
或RESTful API
与其底层 Ansible 基础架构交互。-
Web UI 是图形界面,通过执行对 Ansible Tower RESTful API 的调用来执行操作。
-
🚀 RESTful API 对于考虑将 Ansible 与现有软件工具和流程集成的用户至关重要。
-
-
Ansible Tower 也支持
Cluster
集群方式,集群中的每个节点上都需要安装ansible
和ansible tower
,通过修改配置文件来实现多个 Ansible Tower 组成一个或者多个集群。 -
Ansible Tower 是目前唯一(除自研发方式外)能够实现底层 Ansible 高可用、水平扩展的解决方案。
-
Ansible Tower 将其数据存储在
PostgreSQL
数据库中,同时使用RabbitMQ
消息队列。 -
💥 Ansible Tower <= 3.0 版本还依赖于
MongoDB
数据库。 -
此依赖项后来已被移除,数据现在只存储在 PostgreSQL 数据库中。
-
Ansible Tower 的功能比较简单,集群配置逻辑需通过配置文件实现,没有一个前端维护的界面,因此每次重新配置逻辑都需要在更新配置文件后重跑 Ansible Tower 的 setup 文件。
👉 Ansible Tower 的上游社区(upstream)开源项目为 ansible/awx 项目
-
具有集成式数据库的单一节点:
Ansible Tower 组件、Web 前端、RESTful API 后端和 PostgreSQL 数据库全部部署于单一节点上。
-
具有远程数据库的单一节点:
Tower Web UI 和 RESTful API 后端安装在单一节点上,而 PostgreSQL 数据库安装在同一网络中的另一个节点上。
-
👉 方案 1:
远程数据库托管在 Ansible Tower 管理范围外现有 PostgreSQL 实例的服务器上。
-
👉 方案 2:
使 Ansible Tower 安装程序在远程服务器上创建 PostgreSQL 实例,然后为它填充Ansible Tower 数据库。
-
-
🚀 高可用集群:
-
较旧版本的 Ansible Tower 提供一种主动-被动式冗余架构,其包含一个主动节点和一个或多个被动节点。
-
自 Ansible Tower 3.1 起,该架构现已被具有多个主动 Ansible Tower 节点的主动-主动式高可用集群取代。
-
集群中的每一节点托管 Ansible Tower Web UI 和 RESTful API 后端,可以接收和处理请求。
-
在这种集群架构中,PostgreSQL 数据库可托管于远程服务器上。
-
远程服务器可以驻留包含 Ansible Tower 管理范围外的现有 PostgreSQL 数据库,或者具有安装程序所创建的、由 Ansible Tower 管理的 PostgreSQL 数据库。
-
🤘 Ansible Tower 若配置为高可用集群,至少需要三个节点,并且是奇数个。
-
Ansible Tower 高可用架构示意:
-
如上所示,三个 Ansible Tower 节点组成的集群共享一个
PostgreSQL
数据库。 -
当然也可以给数据库做高可用,如
hot standby/streaming replication
或者warm standby/log shipping
方式,具体方法可参考 PostgreSQL 相关技术文档。 -
每个节点上都有
RabbitMQ
,RabbitMQ 可以连接所有的 ansible tower 节点,并做任务下发的负载均衡。 -
一个任务下发到某个 ansible tower 节点上,任务执行过程中,如果节点出现故障,任务需要重新提交,在其他 ansible tower 节点上执行。
-
-
-
✨ 带有远程数据库的
OpenShift Pod
:-
该架构中,Ansible Tower 的运作方式是作为基于容器的集群在
OpenShift
上运行。 -
该集群在
OpenShift pod
上运行,其中包含用于运行 Ansible Tower 组件的四个容器。 -
OpenShift 添加或删除 pod,以向上和向下扩展 Ansible Tower。
-
该架构的安装过程与其他架构的安装过程有所不同。
若要将 Ansible Tower 部署为 OpenShift 集群的一个 pod,则集群对每个 pod 将需要
6 GB
的内存和3
个 CPU 核心。 -
-
Ansible Tower 可以安装在 64 位
x86_64
版本的RHEL
和CentOS
上,并受支持。 -
内存要求:
-
Ansible Tower 主机上至少需要
4 GB
RAM -
实际内存要求取决于 Ansible Tower 预计要并行配置的主机数最大值
-
这由作业模板或系统配置中的
forks
配置参数管理 -
Red Hat 建议为每个额外的 fork 提供
100 MB
内存,并将2 GB
用于 Tower 服务。
-
-
磁盘存储:
- 至少需要
20 GB
的硬盘空间,并且该空间中的10 GB
必须提供给/var
目录。
- 至少需要
-
Ansible 引擎:
-
Ansible Tower 的安装通过执行运行 Ansible Playbook 的
shell
脚本进行。 -
当前安装过程会自动尝试安装 Ansible 引擎及其依赖项(若其不存在)。
-
若要使 Ansible Tower 正常运行,应使用软件包管理器(如 yum)安装 Ansible 引擎的最新稳定版。
-
安装过程最好由 Ansible Tower 安装程序执行。
-
-
SELinux:
-
Ansible Tower 支持
targeted SELinux
策略,它可以设置为强制模式、许可或禁用。 -
其他 SELinux 策略不受支持。
-
-
License 要求:
- 首次安装并登陆 Ansible Tower 时需要提供
License
。
- 首次安装并登陆 Ansible Tower 时需要提供
-
👉 Ansible Tower 安装程序:
-
Ansible Tower 提供两种不同的安装软件包:
-
-
安装 Ansible 与配置 SSH 登录:
$ yum install -y ansible # 安装 Ansible $ cd /root/.ssh && ssh-keygen -t rsa $ ssh-copy-id root@localhost # 配置 root 用户使用 SSH 免密码实现本地登录
-
Ansible Tower 使用
Ansible Playbook
的方式进行部署,因此需预先安装Ansible
。 -
Ansible Tower 配置过程使用的 inventory 默认
localhost
方式登录。 -
💥 Ansible Tower 部署必须使用
root
用户运行 playbook,否则部署过程报错!
-
-
安装 Ansible Tower:此处使用联网安装方法
$ wget https://releases.ansible.com/ansible-tower/setup/ansible-tower-setup-3.6.3-1.tar.gz # 下载 Ansible Tower 配置软件包,其中包含 inventory 清单文件与 playbook。 $ tar -zxvf ansible-tower-setup-3.6.3-1.tar.gz # 解压 Ansible Tower 配置软件包 $ cd ansible-tower-setup-3.6.3-1 $ vim inventory # 修改 Ansible Tower 部署的主机清单
该 inventory 清单文件如下所示:
$ ./setup.sh # 运行 Ansible Tower 部署配置脚本 # 配置部署过程需执行 15 分钟左右
-
该脚本创建 Ansible Tower 安装所需的 yum 源。
-
💥 安装过程中若相关软件包或依赖安装失败,需将 yum 源中的
gpgcheck
与gppkey
全部禁用,并且启用ansible-tower.repo
。
$ netstat -tunlp # 查看 Ansible Tower 服务组件的监听端口(Nginx、RabbitMQ、PostgreSQL、Postfix)
-
-
登录 Ansible Tower:
-
Ansible Tower 使用
Nginx
监听前端 Web 请求,登录 URL 访问。 -
首次登录 Ansible Tower 需要验证
License
。-
登录 Ansible Tower 必须导入 License 才能使用。
-
可通过点击
REQUEST LICENSE
申请 License,或通过反编译 Python 程序破解 License。 -
申请 License 后,将向注册邮箱发送邮件,其中包含 License。
🤘 该示例使用反编译的方式破解 License。
-
-
反编译 Python 程序:
$ cd /var/lib/awx/venv/awx/lib/python3.6/site-packages/tower_license/ # 切换至 tower license 目录 $ tree -F .
$ pip install uncompyle # 使用 pip 安装 Python 反编译模块 $ cp -avr __init__.pyc __pycache__/ ~ # 备份原 tower license 的 Python 程序 $ cp ~/__init__.pyc . $ uncompyle6 __init__.pyc > __init__.py # 反编译 Python 程序为源代码,并修改该源代码。 $ vim __init__.py # 在第 77 行 _check_cloudforms_subscription() 函数下添加 "return true" 语句以 # 允许无 License 访问。
$ python -m py_compile __init__.py $ python -O -m py_compile __init__.py # 重新编译更改的 __init__.py 脚本,生成 .pyc 与 .pyo 程序。 ┌─[root][tower][.../site-packages/tower_license] └─➞ pwd /var/lib/awx/venv/awx/lib/python3.6/site-packages/tower_license ┌─[root][tower][.../site-packages/tower_license] └─➞ ls -lh total 24K -rw-r--r--. 1 root root 9.0K Feb 23 2020 __init__.pyc -rw-r--r--. 1 root root 9.0K Feb 23 2020 __init__.pyo $ ansible-tower-service restart # 重启 Ansible Tower 各服务组件,并登陆 URL 验证。
-
重新登录 Ansible Tower 则无需 License,部署完成。
-
-
示例 1: