【发布时间】:2020-08-05 22:42:26
【问题描述】:
S哦, 我们有一个场景,我们需要能够在具有相同变量的各种可能值的组中的单个或多个主机上执行自定义命令。
例如-
#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 上执行以下 shell 命令,端口分别为 9998 和 9999。
shell: {{ JAVA_HOME }} -Dprocess.port={{ PORT }}
目前,每次根据 Ansible 默认变量行为,它只针对端口 9999 执行。现在,作为替代方案,我们可以手动分离任务并在我们的 playbook 中调用它两次,如 here. 所述
但是,如果我们有 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 设置,没有发现任何变化。
希望这是有道理的,我们没有把事情搞得太复杂!请推荐几个选项!!!
【问题讨论】:
-
修正语法
[ServersGroups:children]。冒号“:”后不能有空格
标签: ansible ansible-2.x ansible-inventory