场景是:我有几个服务在多个主机上运行。有一项特殊服务 - 反向代理/负载均衡器。任何服务都需要在运行 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"
我有三个问题。
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
而在角色-b 中只输出库存的 my_var
才会输出
TASK [role-b : My_Var on server1] *******************
ok: [server1 -> <ip-of-server2>] =>
my_var: a
我说,应该在 role-b
上运行的 server2
具有 server1
的事实。所以 - 配置“反向代理”服务是在“后端”服务的上下文中完成的。这还会有其他几个问题 - 当你考虑防火墙依赖等时。我可以通过使用标签来避免这种情况 - 但是我不仅需要使用服务的标签运行剧本,还需要使用我想要的所有标签配置,并且我不能再在还包含其他角色的角色中使用 include_tasks 和 args-apply-tags(标签将应用于所有子任务......)。我想念诸如 include_role 之类的东西,但只有特定标签或忽略依赖项。这不是错误,但在 delegate_to
的情况下可能会产生副作用。
我不太确定,有什么问题吗?问题是 - 在 Ansible 中处理主机和角色之间的依赖关系的好方法是什么 - 特别是当它们不在同一主机上时?
答案 0 :(得分:0)
我确定我没有完全理解您的确切问题,但是当我处理负载均衡器时,我使用了一个模板。所以这是我的disable_workers
剧本:
---
- hosts: "{{ ip_list | default( 'jboss' ) }}"
tasks:
- name: Tag JBoss service as 'disabled'
ec2_tag:
resource: "{{ ec2_id }}"
region: "{{ region }}"
state: present
tags:
State: 'disabled'
delegate_to: localhost
- action: setup
- hosts: httpd
become: yes
become_user: root
vars:
uriworkermap_file: "{{ httpd_conf_dir }}/uriworkermap.properties"
tasks:
- name: Refresh inventory cache
ec2_remote_facts:
region: "{{ region }}"
delegate_to: localhost
- name: Update uriworkermap.properties
template:
backup: yes
dest: "{{ uriworkermap_file }}"
mode: 0644
src: ./J2/uriworkermap.properties.j2
不要指望这会按原样工作。 AWS 主机上是 v1.8,情况可能已经改变。
但重点是在每个主机上为该主机的所需状态(启用、禁用、停止)设置用户定义的事实,重新加载事实,然后运行使用这些事实的 Jinja 模板。