Hi Guy,
I've probably tried a broad spectrum on this topic, from a huge playbook covering all my systems, to something very fine grained. I now lie in the middle.
My first approach few years ago was to try to encompass all my needs in one playbook . I didn't even have roles (it was more a side feature at that time). The result was, of course, something completely unusable: side effects were numerous, things were failing all the time, and configuration drift started to cripple in. So, in the end, whatever you choose do, please just don't do this. You wont manage everything in one playbook and one inventory (unless you have a small, i.e.. "project-size", infrastructure). It will just grow to a monster that will eat you.
Now, assuming you have dedicated systems per project, I (currently) think the right size is the project size.
- one repo per role
- one repo containing playbooks & inventories (you might have several inventories e.g. dev, prod, ...)
- each required role as a submodule in playbook's roles/
- one ansible.cfg to point to the proper inventory (dev by default, to limit production accidents)
Having roles as submodules in playbook will let you improve roles without impacting other projects.
I usually split my playbooks per topic (baseline install, daemons, application, ...) but I try to limit splitting as it complicates things (variable, facts & handlers scoping). I use tags when I can but they come with the same limitations, although fact caching (I use Redis) helps a bit.
I also try to list each role explicitely in my playbooks, and try not to rely on dependency magic (and I don't use Galaxy).
Listing dependencies explicitely helps tracking down problems, and makes playbooks much more readable. Generally speaking, role coupling is your worst enemy.
I am pretty happy with this setup right now, but in the end, it is very dependent on your environment and style.
M