我希望有一个角色可以部署ntp客户端(指向内部ntp服务器的主机(和ntp服务器(指向互联网的主机(。
关于如何使用多个角色,有一个很好的链接,但由于两者之间的差异很小(服务器与客户端(,我想知道是否有一种方法可以简化并使用一个具有一定智能的角色来根据需要配置主机。
在我的主机清单中,我有一个组[ntp],它是服务器,其他的都是客户端。
[web]
10.1.1.1
10.1.1.2
[app]
10.1.2.1
10.1.2.2
[db]
10.1.3.1
10.1.3.2
[ntp]
10.1.4.1
10.1.4.2
除了复制到/etc/ntp.conf
的模板之外,部署服务器或客户端的角色/任务基本上是相同的。对于所有主机,除非主机是[ntp]
组的一部分,否则请通过ntp-client.j2
模板进行复制,然后通过ntp-server.j2
模板进行复制。
想法1:在剧本中设置标签
初始剧本是否可以为角色设置标签变量?我的意思不是基于标签进行过滤,而是为它将调用的角色设置它。类似于:
- hosts:all,!ntp
tags: client (set the server tag, don’t filter against the argument)
roles:
- ntp
- hosts:ntp
tags: server (set the server tag, don’t filter against the argument)
roles:
- ntp
然后在角色/ntp/template/main.yml
文件中定义
- name: stuff all host do
module: modulename attribute=value
tags:
- client
- server
- name: stuff just for ntp server
module: modulename attribute=value
tags:
- server
- name: stuff for all hosts (other then ntp servers)
module: modulename attribute=value
tags:
- client
想法2:在任务文件中使用主机
或者在/ntp/tasks/main.yml
文件中,我们可以使用hosts
过滤器来控制什么在什么主机上运行吗?
- hosts: all
- name: stuff all host do
module: modulename attribute=value
- hosts: ntp
- name: stuff just for ntp server
module: modulename attribute=value
- hosts: all,!ntp
- name: stuff for all hosts (other then ntp servers)
module: modulename attribute=value
应该以某种方式用条件词来代替吗?
如果它们只在一个模板上不同,那么您可以将该分配移动到库存中,或者使用group_vars
(等效结果,但不需要污染库存文件(
[all:vars]
ntp_conf_template=ntp-client.j2
; ...etc...
[ntp]
10.1.4.1
10.1.4.2
[ntp:vars]
ntp_conf_template=ntp-server.j2
然后,在任务中:
- name: generate ntp.conf
template:
src: '{{ ntp_conf_template }}'
dest: /etc/ntp.conf