Ansible-在同一主机(不同组)上用覆盖变量(相同名称)启动多个自定义进程



So,我们有一个场景,其中我们需要能够在一个组中的单个或多个主机上执行自定义命令,该组具有相同变量的各种可能值。

例如

#Inventory:
[ServerGroup_1]
abc0001 node=node1
abc0002 node=node2
[ServerGroup_2]
abc0001 node=node3
abc0002 node=node4
[ServersGroups: children]
ServerGroup_1
ServerGroup_2
group_vars/ServerGroup_1
JAVA_HOME: /home/java
PORT: 9998
group_vars/ServerGroup_2
JAVA_HOME: /home/java
PORT: 9999

目标是在主机abc0001上执行shell以下的命令,在单个剧本运行中端口为9998和9999。

shell: {{ JAVA_HOME }} -Dprocess.port={{ PORT }}

目前,每次根据Ansible默认变量行为,它只对端口9999执行。现在,作为一种替代方案,我们可以手动分离任务,并在我们的剧本中调用两次,如下所述。

但是,如果我们有50个不同的端口,编写起来会很乏味,而且我们希望配置能够动态地从清单文件或变量文件中提取,因此,为了添加任何新实例或在不同的端口上运行命令,我们只需要将其添加到清单/变量文件中,而不是编写一个单独的任务来覆盖端口。最终配置应适用于在组中的一台主机或组中的所有主机或特定主机和节点组合上运行该命令的所有可能场景。。。。

ansible-playbook -i staging test_multinode.yml --limit=ServersGroups -l abc0001

上面的剧本运行应该为abc0001上的端口9998和9999执行shell命令,如果只想说只为abc001上的端口999启动进程,剧本需要足够灵活。

注:我们已经尝试过在主机的库存文件中设置一个Port变量来使用with_items块,但这种设置非常严格,不适用于其他情况。我们还尝试了ansible.cfg中的hash_behavior=merge和hash_behevior=replace设置,没有注意到任何更改。

希望这是有道理的,我们没有过度复杂的事情!请提出一些选择!!!

Q:"在具有同一变量的各种可能值的组中的单个或多个主机上执行自定义命令。在主机abc0001上执行shell命令,在单个剧本运行中端口分别为9998和9999";

A:只能合并字典,而不能替换默认行为。请参见DEFAULT_HASH_BEHAVIOUR。将group_vars数据更改为词典。例如

shell> cat group_vars/ServerGroup_1
my_sets:
set1:
JAVA_HOME: /home/java
PORT: 9998
shell> cat group_vars/ServerGroup_2
my_sets:
set2:
JAVA_HOME: /home/java
PORT: 9999

然后,战术手册

shell> cat test.yml
- hosts: ServersGroups
tasks:
- debug:
msg: "{{ item.value.JAVA_HOME }} -Dprocess.port={{ item.value.PORT }}"
loop: "{{ my_sets|dict2items }}"
loop_control:
label: "{{ item.key }}"

给出(节略(

shell> ANSIBLE_HASH_BEHAVIOUR=merge ansible-playbook -l abc0001 test.yml
ok: [abc0001] => (item=set1) => 
msg: /home/java -Dprocess.port=9998
ok: [abc0001] => (item=set2) => 
msg: /home/java -Dprocess.port=9999

Q:"我们还尝试了ansible.cfg中的hash_behavior=merge和hash_behevior=replace设置,没有注意到任何更改">

A:replace选项按预期工作。相同的剧本给出

shell> ANSIBLE_HASH_BEHAVIOUR=replace ansible-playbook -l abc0001 test.yml
ok: [abc0001] => (item=set2) => 
msg: /home/java -Dprocess.port=9999

详细分辨率

简短回答-使用别名重写库存文件

#Inventory:
[ServerGroup_1]
#variable with name PORT on host abc0001 from group1
group1_node1 ansible_host=abc0001 PORT=9998
group1_node2 ansible_host=abc0002 PORT=9999
[ServerGroup_2]
#same variable name Port on the same host abc0001 present in a different group
group2_node1 ansible_host=abc0001 PORT=9998
group2_node2 ansible_host=abc0002 PORT=9999
[ServersGroups: children]
ServerGroup_1
ServerGroup_2

我们使用group1_node1作为别名,因此通过这样做,Ansible将把group1_node1和group2_node1注册为两个不同的主机,即使它是同一主机abc0001。

现在,我们将能够在同一主机abc0001上使用相同变量名PORT.的不同参数启动两个进程

ansible-playbook -i staging test_multinode.yml --limit=ServersGroups -l group1_node1:group2_node1

希望这是清楚的。

最新更新