【问题标题】:Ansible- start multiple custom processes with overriding variables (same name) on same host (different group)?Ansible-在同一主机(不同组)上使用覆盖变量(相同名称)启动多个自定义进程?
【发布时间】: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


【解决方案1】:

问:“在组中的单个或多个主机上执行自定义命令,具有相同变量的各种可能值。在单个 playbook 运行中使用端口为 9998 和 9999 的主机 abc0001 上执行 shell 命令。"

答:只能合并字典而不是替换默认行为。见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

问:“我们也尝试了 ansible.cfg 中的 hash_behavior=merge 和 hash_behavior=replace 设置,没有发现任何变化。”

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

shell> ANSIBLE_HASH_BEHAVIOUR=replace ansible-playbook -l abc0001 test.yml

ok: [abc0001] => (item=set2) => 
  msg: /home/java -Dprocess.port=9999

【讨论】:

  • 感谢您的回复。我们尝试了另一种替代方法,即使用 here 所述的别名。到目前为止,该解决方案一直适用于所有给定场景。
  • 发布详细信息。我想学习这个替代方案。
  • 根据您的要求,我写了一篇博客,详细说明solution。请检查一下。希望对您有所帮助。
  • 是的。这很有帮助。谢谢你。但是,它不是“同一主机(不同组)上的变量(相同名称)”。换句话说,这不是您在此处发布的问题的解决方案。
  • 感谢您的反馈。不确定,如果文章不清楚,或者我在此处发布的问题存在一些误传。这是我试图解决的问题的解决方案,即在具有不同端口变量值的节点上启动多个进程。在使用别名修改的清单中,我们现在可以在同一主机 (abc001) 上使用“相同的变量名 (PORT),它是多个/不同组 ServerGroup_1/ServerGroup_2 的一部分,具有多个值作为 9000 和 9001,而没有获取 PORT 变量替换或覆盖。”
【解决方案2】:

Detailed Resolution

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

 #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

希望这很清楚。

【讨论】:

    猜你喜欢
    • 2019-06-09
    • 1970-01-01
    • 1970-01-01
    • 2019-10-31
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 2013-08-18
    • 2017-10-20
    相关资源
    最近更新 更多