这是一个棘手的理论问题,甚至解释本身也很难。
我Bacula
这里以(服务器备份软件)为例,以便更加清楚。
Bacula 有一个服务器和一个客户端组件。添加新客户端需要在服务器和客户端上都有一个配置文件。所以我想在我的角色中做的是:
Bacula 服务器角色:
- 在一台主机上设置bacula服务器
- [针对每个客户端] 将服务器的客户端配置文件复制到服务器
- [针对每个客户端] 将客户端配置文件复制到客户端
现在我遇到的问题是host_vars
和group_vars
。我希望能够让所有[debian]
主机(这是一个组)使用此角色。因此,我的剧本如下所示:
- hosts: debian
roles:
- bacula
tags:
- bacula
因此,当触发此角色时,它应该执行以下操作:
- 一个主机显然必须是服务器,因此如果它在服务器主机上播放,它将获得完整的 bacula 服务器配置。
- 如果将此角色应用于所有其他客户端,则应该发生以下情况:
- (当前主机
debian-client
):将配置复制到debian-client
- (当前主机
debian-client
):将配置复制到debian-server
- (当前主机
你知道该如何做吗?
对我来说,这真的很难解释,所以如果上述内容有任何不清楚的地方,请告诉我,以便我可以更清楚地解释。
更新:
感谢@Konstantin Suvorov 的delegate_to
回答:https://docs.ansible.com/ansible/playbooks_delegation.html#delegation
答案1
例如这样的:
存货:
[debian]
host1
host2
host3 bacula_role=server
host4
host5
玩:
- hosts: debian
vars:
bacula_server: "{{ (ansible_play_hosts | map('extract',hostvars) | selectattr('bacula_role','defined') | selectattr('bacula_role','equalto','server') | first).inventory_hostname }}"
tasks:
- debug: msg="Install server"
when: inventory_hostname == bacula_server
# client block
- block:
- debug: msg="Template server-side client config"
delegate_to: bacula_server
- debug: msg="Template client config"
when: inventory_hostname != bacula_server
# end of block
debug
用一些真实的模块(例如apt
/ )替换语句template
,并且如果不bacula_role=server
存在主机则添加一些错误处理。
如果您有许多任务要安装服务器/客户端,您可以将它们拆分bacula_server.yml
为bacula_client.yml
不带when
语句的任务,但包括以下内容:
- include: "bacula_{{ bacula_role | default('client') }}.yml"