集群是在主机之间共享负载。每个实例都应该能够充当 UI 和 API 访问的入口点。这应该使 Tower 管理员能够在尽可能多的实例前面使用负载均衡器并保持良好的数据可见性。
注意
负载均衡是可选的,完全有可能根据需要在一个或所有实例上进行入站。
每个实例都应该能够加入 Tower 集群并扩展其执行作业的能力。这是一个简单的系统,作业可以在任何地方运行,而不是被指示在哪里运行。此外,集群实例可以分组到不同的池/队列中,称为 实例组。
Tower 支持使用 OpenShift 的基于容器的集群,这意味着可以在此平台上安装新的 Tower 实例,而不会在功能方面有任何变化或偏差。但是,存在某些 OpenShift 部署和配置 差异需要考虑。您可以创建实例组以指向 Kubernetes 容器。有关更多详细信息,请参见 执行环境 部分。
支持的操作系统
以下操作系统支持建立集群环境
Red Hat Enterprise Linux 7 或更高版本(建议使用 RHEL8,可以是 RHEL 7 或 Centos 7 实例)
注意
在 OpenShift 中运行 Ansible Tower 时,不支持隔离实例。
本节仅涵盖集群的初始设置。有关升级现有集群的信息,请参阅 升级规划 的 *Ansible Tower 升级和迁移指南*。
在新集群环境中需要注意的重要事项
PostgreSQL 仍然是独立实例,未进行集群化。Tower 不管理副本配置或数据库故障转移(如果用户配置了备用副本)。
启动集群时,数据库节点应为独立服务器,并且不应该在任何 Tower 节点上安装 PostgreSQL。
集群中支持的最大实例数为 20 个。
所有实例都应该可以从所有其他实例访问,并且它们应该能够访问数据库。主机拥有稳定地址和/或主机名(取决于 Tower 主机的配置方式)也很重要。
所有实例必须位于地理位置上,实例之间具有可靠的低延迟连接。
为了升级到集群环境,您的主实例必须是清单中 tower
组的一部分,*并且*它需要是 tower
组中列出的第一个主机。
手动项目必须由客户手动同步到所有实例,并在所有实例上同时更新。
新的 Tower 系统中没有主/从的概念。所有系统都是主要的。
Tower 部署的 inventory
文件应保存/持久化。如果要配置新的实例,则必须将密码和配置选项以及主机名提供给安装程序。
配置新的实例涉及更新 inventory
文件并重新运行设置剧本。重要的是,inventory
文件包含安装集群时使用的所有密码和信息,否则其他实例可能会被重新配置。inventory
文件清单包含一个清单组 tower
。
注意
所有实例负责与任务调度相关的各种日常工作,例如确定作业应该在何处启动以及处理剧本事件,以及定期清理。
[tower]
hostA
hostB
hostC
[instance_group_east]
hostB
hostC
[instance_group_west]
hostC
hostD
注意
如果未为资源选择任何组,则将使用 tower
组,但如果选择了任何其他组,则 tower
组将不会以任何方式使用。
database
组保留用于指定外部 PostgreSQL。如果数据库主机是单独配置的,则此组应为空
[tower]
hostA
hostB
hostC
[database]
hostDB
当剧本在集群中的单个 Tower 实例上运行时,该剧本的输出将作为 Tower 基于 WebSockets 的流式输出功能的一部分广播到所有其他节点。最好通过在清单中为每个节点指定一个私有可路由地址来使用内部寻址处理此数据广播
[tower] hostA routable_hostname=10.1.0.2 hostB routable_hostname=10.1.0.3 hostC routable_hostname=10.1.0.4
注意
Ansible Tower 的先前版本使用变量名 rabbitmq_host
。如果您从 Tower 的先前版本升级,并且之前在您的清单中指定了 rabbitmq_host
,只需在升级之前将 rabbitmq_host
重命名为 routable_hostname
即可。
Tower 和 Automation Hub 使用的端口,以及内部部署的 Automation Hub 节点所需的端口如下:
80、443(常规 Tower 和 Automation Hub 端口)
22(ssh - 只需入站)
5432(数据库实例 - 如果数据库安装在外部实例上,则需要向 Tower 实例开放)
对于希望通过 Tower 之外的某些系统(例如外部管理的无密码 SSH 密钥)管理从“控制器”节点到“隔离”节点的 SSH 身份验证的用户,可以通过运行取消配置命令来禁用此行为:awx-manage remove_isolated_key
。
Tower 本身通过 /api/v2/ping
的可浏览 API 报告尽可能多的状态,以便验证集群的运行状况,包括:
提供 HTTP 请求的实例
集群中所有其他实例的最后一次心跳的时间戳
实例组和实例在这些组中的成员资格
查看有关实例和实例组的更多详细信息,包括正在运行的作业和成员资格信息,请访问 /api/v2/instances/
和 /api/v2/instance_groups/
。
每个 Tower 实例都由多个协同工作的不同服务组成
HTTP 服务 - 这包括 Tower 应用程序本身以及外部 Web 服务。
回调接收器 - 从正在运行的 Ansible 作业接收作业事件。
调度程序 - 处理和运行所有作业的 worker 队列。
Redis - 此键值存储用作从 ansible-playbook 传播到应用程序的事件数据的队列。
Rsyslog - 用于将日志传递到各种外部日志服务的日志处理服务。
Tower 的配置方式是,如果这些服务或其组件中的任何一个出现故障,则所有服务都将重新启动。如果这些服务在短时间内频繁出现故障,则整个实例将以自动方式离线,以便在不导致意外行为的情况下进行修复。
有关备份和还原集群环境的信息,请参阅 集群环境的备份和还原 部分。
Tower 的“普通”用户运行和报告作业的方式不会改变。在系统方面,一些差异值得注意
当从 API 接口提交作业时,作业将被推入调度程序队列。每个 Tower 实例都将使用特定的调度算法连接并接收来自该队列的作业。集群中的任何实例都有可能接收工作并执行任务。如果某个实例在执行作业时出现故障,则该工作将标记为永久失败。
项目更新会在任何可能运行作业的实例上成功运行。项目会在运行作业之前立即将自身同步到实例上的正确版本。如果所需的修订版已在本地检出,并且不需要 Galaxy 或 Collections 更新,则可能不会执行同步。
当同步发生时,它会在数据库中被记录为项目更新,其中 launch_type = sync
和 job_type = run
。项目同步不会更改项目的狀態或版本;相反,它们只会更新运行它们的实例上的源树。
如果需要从 Galaxy 或 Collections 更新,则会执行同步,下载所需的角色,并在您的 /tmp 文件中占用更多空间。如果您有一个大型项目(大约 10 GB),则 /tmp
上的磁盘空间可能会成为问题。
默认情况下,当作业被提交到 Tower 队列时,它可以被任何 worker 接收。但是,您可以控制特定作业的运行位置,例如限制作业可以运行的实例。
为了支持暂时将实例离线,每个实例上都启用了某个属性。当此属性被禁用时,不会将任何作业分配给该实例。现有作业将完成,但不会分配任何新工作。
重新运行设置 playbook 不会自动取消配置实例,因为集群目前不会区分有意离线或因故障离线的实例。相反,关闭 Tower 实例上的所有服务,然后从任何其他实例运行取消配置工具
使用命令关闭实例或停止服务:ansible-tower-service stop
。
从另一个实例运行取消配置命令 $ awx-manage deprovision_instance --hostname=<name used in inventory file>
,将其从 Tower 集群中移除。
例如:
awx-manage deprovision_instance --hostname=hostB
同样,取消配置 Tower 中的实例组不会自动取消配置或删除实例组。有关更多信息,请参阅 取消配置实例组 部分。