Ansible playbook:以逗号分隔列出所有服务器,并排除自己的服务器
我有三台服务器Ansible playbook:以逗号分隔列出所有服务器,并排除自己的服务器,ansible,yaml,Ansible,Yaml,我有三台服务器 [servers] server1 server2 server3 我想为每个服务器创建一个不包含自身的服务器列表:例如 对于server1:应该是server2、server3 对于服务器2:应该是服务器1、服务器3 对于server3:应该是server1、server2 我可以创建所有服务器的列表,但不知道如何排除一个服务器 - hosts: servers vars: network_check_list: "{{groups['servers']|
[servers]
server1
server2
server3
我想为每个服务器创建一个不包含自身的服务器列表:例如
- 对于server1:应该是server2、server3李>
- 对于服务器2:应该是服务器1、服务器3李>
- 对于server3:应该是server1、server2李>
- hosts: servers
vars:
network_check_list: "{{groups['servers']|join(',')}}"
您可以将
差异
过滤器与包含当前目标服务器的单个元素列表一起用作参数:
---
- hosts: servers
gather_facts: false
vars:
network_check_list: "{{ groups['servers'] | difference([inventory_hostname]) | join(',') }}"
tasks:
- debug:
var: network_check_list
由于jinja2表达式是现场解释的,并且对于特定服务器上的每次运行,您可以将此定义保留在playbook变量中,并且它将根据任务中的每个上下文进行调整。以下是结果(使用您的示例库存):
参考:
$ ansible-playbook -i inventory play.yml
PLAY [servers] ****************************************************************************************************************************************************************************************************
TASK [debug] ******************************************************************************************************************************************************************************************************
ok: [server1] => {
"network_check_list": "server2,server3"
}
ok: [server2] => {
"network_check_list": "server1,server3"
}
ok: [server3] => {
"network_check_list": "server1,server2"
}
PLAY RECAP ********************************************************************************************************************************************************************************************************
server1 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
server2 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
server3 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0