我有三台服务器
[servers]
server1
server2
server3
我想为每个服务器创建服务器列表而不包括其自身:例如
- 对于 server1:应该是 server2,server3;
- 对于 server2:应该是 server1,server3;
- 对于 server3:应该是 server1,server2;
我可以创建所有服务器的列表,但不知道如何排除一台服务器?
- hosts: servers
vars:
network_check_list: "{{groups['servers']|join(',')}}"
最佳答案
您可以将difference
过滤器与包含当前目标服务器作为参数的单个元素列表一起使用:
---
- 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
引用号:https://docs.ansible.com/ansible/latest/user_guide/playbooks_filters.html#set-theory-filters
关于Ansible 剧本 : list all servers as comma separated and exclude own server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60072442/