Okay, so the only way to exclude a host is at the play level, not the role
level?
Yes. Roles are basically just some automation around a set of tasks.
It would be more ideal for my setup to exclude at the role level, that way
I can ensure that any new play that is written that includes a particular
role won't run it against blacklisted hosts.
If you really want to be sure, add a conditional to the role tasks:
when: inventory_hostname != mailserver
Moreover, having hosts excluded at the play level means that entire play
will be skipped on blacklisted hosts, but perhaps only 1 of the roles in
the play is blacklisted,
Yes, that is by design. You need to model playbooks to include roles and
target a particular set of hosts.
and so if the blacklist/exclusion happened at the role level then the play
would run on the blacklisted host and just complete all of the roles that
were allowed.
For example, say I have a play called common.yml which sets up several
common features on hosts. It is defined as follows:
roles:
- ntp
- postfix
- smartmontools
It would be nice to be able to just run the common.yml play against all
hosts, and have it configure ntp and smartmontools on all hosts but only
postfix on the hosts which aren't mailservers.
Then you need to split this up in multiple plays. Take the postfix role out
of 'common', as it is not common to all your hosts.
Is this possible? If I add "- hosts: !mailserver" to common.yml, then the
complete play will be skipped on "mailserver".
should be hosts: all:!mailserver but yes
Serge