Ansible-在同一主机(不同组)上使用覆盖变量(相同名称)启动多个自定义进程?
Ansible- start multiple custom processes with overriding variables (same name) on same host (different group)?
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 执行。现在,作为替代方案,我们可以手动分离任务并在我们的剧本中调用它两次,如解释的那样 here.
但是,如果我们有 50 个不同的端口,编写起来会很乏味,而且我们希望配置能够动态地从清单文件或变量文件中获取,以便添加任何新实例或运行在不同的端口上使用命令,我们只需要将它添加到我们的 inventory/variable 文件中,而不是编写一个单独的任务来覆盖端口。最终配置应该适用于 运行 在组中的一台主机或组中的所有主机或特定主机和节点组合上执行该命令的所有可能场景....
ansible-playbook -i staging test_multinode.yml --limit=ServersGroups -l abc0001
上面的剧本 运行 应该对 abc0001 上的端口 9998 和 9999 执行 shell 命令,剧本需要足够灵活,如果只是想说只为端口启动进程abc0001 上的 9998。
注意:
我们已经通过在主机的清单文件中设置端口变量来尝试 with_items 块,但该设置非常严格,不适用于其他场景。
我们也尝试了 hash_behavior=merge 和 hash_behavior=replace ansible.cfg 中的设置,没有发现任何变化。
希望这是有道理的,我们没有把事情搞得太复杂!请提出几个选项!!!
Q: "Execute a custom command on a single or multiple hosts from a group with various possible values of the same variable. Execute shell command on host abc0001 with Ports as 9998 and 9999 within a single playbook run."
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: "We have also tried hash_behavior=merge and hash_behavior=replace settings in ansible.cfg, did not notice any change."
A:replace
选项按预期工作。同样的剧本给出
shell> ANSIBLE_HASH_BEHAVIOUR=replace ansible-playbook -l abc0001 test.yml
ok: [abc0001] => (item=set2) =>
msg: /home/java -Dprocess.port=9999
Short Answer- Rewrite the inventory file using aliases
#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
希望这是清楚的。
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 和 9999shell: {{ JAVA_HOME }} -Dprocess.port={{ PORT }}
目前,每次根据 Ansible 默认变量行为,它只会针对端口 9999 执行。现在,作为替代方案,我们可以手动分离任务并在我们的剧本中调用它两次,如解释的那样 here.
但是,如果我们有 50 个不同的端口,编写起来会很乏味,而且我们希望配置能够动态地从清单文件或变量文件中获取,以便添加任何新实例或运行在不同的端口上使用命令,我们只需要将它添加到我们的 inventory/variable 文件中,而不是编写一个单独的任务来覆盖端口。最终配置应该适用于 运行 在组中的一台主机或组中的所有主机或特定主机和节点组合上执行该命令的所有可能场景....
ansible-playbook -i staging test_multinode.yml --limit=ServersGroups -l abc0001
上面的剧本 运行 应该对 abc0001 上的端口 9998 和 9999 执行 shell 命令,剧本需要足够灵活,如果只是想说只为端口启动进程abc0001 上的 9998。
注意: 我们已经通过在主机的清单文件中设置端口变量来尝试 with_items 块,但该设置非常严格,不适用于其他场景。 我们也尝试了 hash_behavior=merge 和 hash_behavior=replace ansible.cfg 中的设置,没有发现任何变化。
希望这是有道理的,我们没有把事情搞得太复杂!请提出几个选项!!!
Q: "Execute a custom command on a single or multiple hosts from a group with various possible values of the same variable. Execute shell command on host abc0001 with Ports as 9998 and 9999 within a single playbook run."
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: "We have also tried hash_behavior=merge and hash_behavior=replace settings in ansible.cfg, did not notice any change."
A:replace
选项按预期工作。同样的剧本给出
shell> ANSIBLE_HASH_BEHAVIOUR=replace ansible-playbook -l abc0001 test.yml
ok: [abc0001] => (item=set2) =>
msg: /home/java -Dprocess.port=9999
Short Answer- Rewrite the inventory file using aliases
#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
希望这是清楚的。