【发布时间】:2021-07-25 22:45:16
【问题描述】:
场景是:我在多个主机上运行多个服务。有一项特殊服务 - 反向代理/负载均衡器。任何服务都需要在运行 rp/lp 服务的主机上配置该特殊服务。在安装/更新/删除带有Ansible角色的随机服务时,我需要在特定主机上调用ReverseProxy角色来配置对应的vhost。
目前,我以反向代理角色调用特定任务文件,以使用include_role 通过服务添加或删除虚拟主机并设置一些变量(非常简单的示例,没有服务和库存特定变量)。
- name: "Configure ReverseProxy"
include_role:
name: reverseproxy
tasks_from: vhost_add
apply:
delegate_to: "{{ groups['reverseproxy'][0] }}"
vars:
reverse_proxy_url: "http://{{ ansible_fqdn }}:{{ service_port }}/"
reverse_proxy_domain: "sub.domain.tld"
我有三个问题。
- 我知道,在角色和不同主机之间建立这种依赖关系并不是一个好主意。我不知道更好的方法,特别是如果您考虑这种情况,在创建虚拟主机后需要做一些额外的事情(例如,通过 REST API 配置服务,这需要外部 fqdn)。如果有两个单独的剧本具有“后端”服务和“反向代理”服务——那么我需要第三个剧本来配置“挂起”服务。另外我不确定是否可以在反向代理角色中检索正确的后端 URL(只考虑 HTTP 方案或路径)。这听起来不容易,还是?
- 之前我有单独的角色来添加/删除虚拟主机到反向代理。这个角色没有依赖关系,但我需要复制几个默认值、模板和变量等,这也不好。然后我将其更改为单个角色。当然-在我看来,这并不是真正的“角色”应该是什么。角色类似于“webserver”或“reverseproxy”(一种状态)。但不是像“add_vhost_to_reverseproxy”(动词)这样的东西。这就像一本剧本 - 但是通过角色调用参数化剧本是一个好主意/可能吗?主要问题是,
reverseproxy的状态是库存中所有服务的总和。 - 如果包含单个角色(包括它),也会启动所有相关角色(配置自定义、防火墙等)。然而,在那种情况下,我发现,代表团没有使用受委托主持人的事实。
我使用以下示例进行了测试 - 库存:
all:
hosts:
server1:
my_var: a
server2:
my_var: b
children:
service:
hosts:
server1:
reverseproxy:
hosts:
server2:
还有将role-a 分配给webserver 组的剧本。 role-a 的任务如下:
- block:
- setup:
- name: "Include role b on delegated {{ groups['reverseproxy'][0] }}"
include_role:
name: role-b
delegate_to: "{{ groups['reverseproxy'][0] }}"
delegate_facts: true # or false or omit - it has no effect on Ansible 2.9 and 2.10
并且在role-b中只输出库存的my_var会输出
TASK [role-b : My_Var on server1] *******************
ok: [server1 -> <ip-of-server2>] =>
my_var: a
这告诉我,应该在server2 上运行的role-b 具有server1 的事实。所以 - 配置“reverseproxy”服务是在“后端”服务的上下文中完成的。这会有其他几个问题-当您考虑防火墙依赖项等时。我可以通过使用标签来避免这种情况-但是我不仅需要使用服务标签运行剧本,还需要使用我想要的所有标签配置,并且我不能再在还包括其他角色的角色中使用带有 args-apply-tags 的 include_tasks(标签将应用于所有子任务......)。我想念 include_role 之类的东西,但只有特定的标签或忽略依赖项。这不是错误,但在 delegate_to 的情况下可能会产生副作用。
我不太确定,问题是什么?问题是 - 在 Ansible 中处理主机和角色之间的依赖关系的好方法是什么 - 特别是当它们不在同一主机上时?
【问题讨论】:
-
这太宽泛了,您的问题可能会被关闭。只是为了让您走上正轨:尝试重新考虑问题,就好像 RP/LB 不在您的库存中一样。您将需要一个接口(API、文件共享、邮箱、信鸽......)来访问它。
标签: ansible