Nine times out of ten, you probably create a group by listing the hosts to include. In some occassions however, you might want to create a group based on hosts that shouldn’t be in it.
This isn’t possible in a static inventory, however you can do it dynamically.
Given the following hosts file, lets create a group that excludes ubuntu1204
[centos] centos66 ansible_ssh_host=192.168.35.21 centos70 ansible_ssh_host=192.168.35.22 [ubuntu] ubuntu1204 ansible_ssh_host=192.168.35.31 ubuntu1410 ansible_ssh_host=192.168.35.32It requires a 2 step process
- the difference filter to get all items in list1 that don’t exist in list2
- the add_host module to generate the actual group from the list
e.g.
--- - hosts: centos66 remote_user: vagrant tasks: - set_fact: others: "{{ groups['all'] | difference(['ubuntu1204']) }}" - add_host: name: "{{ item }}" groups: all_but_ubuntu1204 with_items: others - debug: var=groups - hosts: all_but_ubuntu1204 tasks: # - ...which gives the following output
TASK: [debug var=groups] ****************************************************** ok: [centos66] => { "var": { "groups": { "all": [ "ubuntu1204", "centos66", "centos70", "ubuntu1410" ], "all_but_ubuntu1204": [ "centos66", "centos70", "ubuntu1410" ], "centos": [ "centos66", "centos70" ], "ubuntu": [ "ubuntu1204", "ubuntu1410" ], "ungrouped": [] } } }