- Reuse: there are certain provisioning tasks that are common to all servers, how to organise them in a such way they can be reused easily?
- Organisation: similar as any programming code, without maintenance and good engineering practices, the provisioning process will be difficult to maintain and understand. Naming, modules organisation, conventions are all aspects that needs to be taken into account.
Ansible Roles are conventions that as a programmer you need to follow in order to achieve good level of reuse and modularisation. These conventions were added on version 1.2 and before this, the way to achieve better level of reuse was separating scripts into different files and including them on other scripts you want to reuse.
The documentation is very sparse when describing how Roles work, but the idea is pretty simple. Using Roles, you will be able to automatically load tasks, variables, files and handlers when provisioning a server or a group of them.
Lets look to an example, here I'm provisioning a Java application service. The server to run this application will need to have the following roles:
Ansible will automatically look for a directories called commons and service inside the main directory roles and execute all steps defined for them.
For the role service, we have:
- files: All files used on tasks will loaded from there.
There is still more directories that can be defined like templates and defaults. They aren't present on this example but are still useful. This is the full working example that provision a server that is able to run this Java application.
Using roles is great because they are expressive. Working with them properly you will be able to say what a given server is, which is much more declarative than just use the include directives. The directory conventions are good to define patterns to the whole team follow since day one and reuse achieved by defining very granular roles that can be set on different play books.