You can include role dependencies in the
meta/main.yml for a role. These are roles that will also be installed by the role, prior to the role installing itself.
So, for common things you need on all machines, you can have a 'common' role. Then, in the meta/main.yml for more specific roles, you can establish 'common' as a dependency. This is a snippet from one of my more complex roles that combines a lot of smaller roles:
#~ansible/private/slack_lab/meta/main.yml
# The order listed is the order they will run.
# Tasks for this role (lab) will run after
# tasks for dependencies complete.
dependencies:
- { role: slack_common }
- { role: slack_nfsclient }
- { role: slack_nisclient }
- { role: ntpclient }
- { role: x11forwarding }