在我们的剧本中,我们有一个名为:
backupserver
的主机
假设我们有一个很大的库存清单 +- 100。
现在我们有了一个新的备份服务器,所以我们最终有 2 个不同的主机:
backupserver-1
backupserver-2
对于每个库存,我们要指定使用哪一个。 例如
但是他们使用相同的剧本,其中我们指向备份服务器。
例如
delegate_to: backupserver
我们的目标是仅在清单文件中设置正确的备份服务器,我们不想更改剧本。 是否可以制作类似别名的东西来从库存中指向? 我的想法(以下是一个组,所以不是单个委托选项,并且不起作用)
在 库存 1
hosts:
backupserver:
backupserver1
库存2
hosts:
backupserver:
backupserver2
假设我们要更改 backupserver2 的 IP 地址,我们不想更新所有库存文件,但希望有 1 个共享的 backupserver2 定义,因此我们可以从 1 个位置更新它,例如使用
host_vars
。
我脑海中所想象的:
或者还有另一种有意义的方法,我们可以在清单文件中拥有不同的目标,但在剧本中拥有相同的名称。
假设我们想要更改 backupserver2 的 IP 地址,但我们不想 更新所有清单文件,但想要有 1 个定义 backupserver2 是共享的,因此我们可以从 1 个位置更新它,例如 与主机变量。
如果
backupserver-1
和 backupserver-2
是 names,而不是 ip 地址,则您建议的语法很接近,但不正确;你会想要在清单 1 中添加这样的东西:
all:
hosts:
backupserver:
ansible_host: backupserver-1
在库存2中:
all:
hosts:
backupserver:
ansible_host: backupserver-2
等等
如果您使用 IP 地址(为什么要这样做?),您可以利用“库存文件”实际上可以是多个文件这一事实。将备份服务器的条目放在单独的文件中。也就是说,使用以下命令创建
backupserver1.yaml
:
all:
hosts:
backupserver:
ansible_host: backupserver-1
现在你可以像这样运行ansible:
ansible-playbook playbook.yaml -i inventory1.yaml -i backupserver1.yaml
或者如果您正在使用库存 2:
ansible-playbook playbook.yaml -i inventory2.yaml -i backupserver2.yaml
无论哪种情况,如果
backupserver1
的地址发生变化,您只需更新一个位置的值,其他服务器也类似。
或者,如果您与备份服务器的唯一交互是通过委托,那么可能有一个更简单的解决方案。只需将所有备份服务器放在一个清单文件中即可:
backupservers:
hosts:
backupserver1:
backupserver2:
设置库存变量以识别该库存的适当备份服务器,例如在
inventory1.yaml
:
servers:
hosts:
node0:
node1:
vars:
backupserver: backupserver1
在您的剧本中,使用
delegate_to
选项中的变量:
- hosts: servers
tasks:
- name: mumble backup server mumble
delegate_to: "{{ backupserver }}"
command: date
然后始终包含您的“目标”库存和备份服务器库存:
ansible-playbook playbook.yaml -i inventory1.yaml -i backupservers.yaml