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

Ansible-在同一主机(不同组)上启动多个具有覆盖变量(相同名称)的自定义进程?,ansible,ansible-2.x,ansible-inventory,Ansible,Ansible 2.x,Ansible Inventory,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_var

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
目标是在一次playbook运行中,在主机abc0001上使用端口9998和9999执行低于shell的命令

shell: {{ JAVA_HOME }} -Dprocess.port={{ PORT }}
目前,根据Ansible默认变量行为,每次仅对端口9999执行。现在,作为替代方案,我们可以手动分离任务,并在我们的剧本中调用两次,如前所述

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

ansible-playbook -i staging test_multinode.yml --limit=ServersGroups -l abc0001
上述playbook运行应为abc0001上的端口9998和9999执行shell命令,如果只想说仅为abc0001上的端口9998启动进程,playbook需要足够灵活

注: 通过在主机的清单文件中设置端口变量,我们尝试了with_items块,但该设置非常严格,不适用于其他场景。 我们还尝试了ansible.cfg中的hash_behavior=merge和hash_behavior=replace设置,但没有注意到任何更改

希望这是有意义的,我们没有太复杂的事情!请建议一些选择

Q:“使用同一变量的各种可能值在一个组中的一台或多台主机上执行自定义命令。在一次playbook运行中,在主机abc0001上执行shell命令,端口为9998和9999。”

答:只能合并词典,而不能替换默认行为。看见将组变量数据更改为字典。比如说

shell>cat组变量/服务器组1
my_套装:
set1:
JAVA\u HOME:/HOME/JAVA
港口:9998
外壳>cat组变量/服务器组2
my_套装:
set2:
JAVA\u HOME:/HOME/JAVA
港口:9999
然后是剧本

shell>cat test.yml
-主机:服务器组
任务:
-调试:
msg:“{item.value.JAVA_HOME}-Dprocess.port={{item.value.port}”
循环:{{my_集| dict2items}}”
回路控制:
标签:“{item.key}}”
给出(节略)

shell>ANSIBLE\u HASH\u behavior=merge ANSIBLE playbook-l abc001 test.yml
确定:[abc0001]=>(项=set1)=>
msg:/home/java-Dprocess.port=9998
确定:[abc0001]=>(项=设置2)=>
msg:/home/java-Dprocess.port=9999

问:“我们还尝试了ansible.cfg中的hash_behavior=merge和hash_behavior=replace设置,但没有注意到任何更改。”

答:
replace
选项按预期工作。同样的剧本

shell>ANSIBLE\u HASH\u behavior=替换ANSIBLE剧本-l abc001 test.yml
确定:[abc0001]=>(项=设置2)=>
msg:/home/java-Dprocess.port=9999

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

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

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

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

希望这是清楚的。

修复语法
[ServersGroups:children]
。冒号后面不能有空格:“谢谢您的回复。我们尝试了另一种替代方法,即使用如上所述的别名。到目前为止,此解决方案已在所有给定场景下运行。发布详细信息。我想了解一下这个选择。根据你的要求,我写了一个详细的博客。请检查一下。希望对你有帮助。这很有帮助。非常感谢。但是,这并不是“同一主机(不同组)上的变量(相同名称)”。换句话说,这并不是你在这里发布的问题的解决方案。谢谢你的反馈。不确定,如果文章不清楚,或者我在这里发布的问题有一些误传。这是我试图解决的问题的解决方案,即在具有不同端口变量值的节点上启动多个进程。在使用alias修改的清单中,我们现在可以使用“同一主机(abc001)上的同一变量名(端口),它是多个/不同组ServerGroup_1/ServerGroup_2的一部分,多个值为9000和9001,而无需替换或覆盖端口变量。”
ansible-playbook -i staging test_multinode.yml --limit=ServersGroups -l group1_node1:group2_node1