Question about design of playbooks and roles

Hi,

I have a design/architecture question about the best structure of playbook/roles in ansible.
While we are most redundancy tasks for divers servers/applications like : configuration of firewall, software, services, certificate, etc… and we use many times the same module. I thought it would be appropriate to create identical roles for each function. Here’s an example:

ansible.cfg
playbooks
├── playbook_configure_linux_default.yml
├── playbook_configure_webservers.yml
└── playbook_configure_mariadb.yml
...etc
roles
├── role_software
├── role_firewall
└── role_services
...etc

But does this correspond to ansible logic? Or is it preferable to define one role per function? like these:

playbooks
├── playbook_configure_linux_default.yml
├── playbook_configure_webservers.yml
└── playbook_configure_mariadb.yml
...etc
roles
├── role_linux_default
├── role_webservers
└── role_mariadb
...etc

I don't think there's just one solution, but I'd like to hear your opinion on the one that ultimately corresponds best to the philosophy of ansible.

You could have a look at my setup, the
One role to rule them all on Github (One role to rule them all · GitHub) and the presentation I gave at CfgMgmtCamp (Ansible in a dev, tst, acc and prod enviroment - Speaker Deck)