Best practices to configure roles

Hi,

I try to build a playbook that kind of leaves the trivial ranges usually handled in books. Consequentially I did not find anything suitable in the books I have and my development skills do not help me further.

Assume this: I want to build a VM that combines multiple bitnami stacks (bitnami.com, a stack is actually a preset combination of web-server, application and db, with a full-fledged installer for those who never came across these).

Logically I made roles out of this:

  • bitnami-redmine

  • bitnami-tracks


  • Now each of the roles needs an individual configuration, e.g.

  • tcp-ports

  • directories

  • users and passwords
    At first I used a dicts from the global scope.

Now the tasks of each stack look much alike and I found myself text-editing a lot like search&replace for ages including the related human errors.

I was not exactly fond of this solution, so - still learning and experimenting with ansible - I changed that to a parameter-dict.

Calling this along the pattern sketched here:

`
vars:
redmine-cfg:
directory: …
port: 1234

roles:

  • { role: bitnami-redmine, config: {{ redmine-cfg }} }

`

Now I learned that dicts do not mix when overwriting. In this special case, the defaults do not mix with the parameter. So the parameter dict must be complete, or I need to code the defaults into tasks and templates using the jinja-syntax and forget about the defaults/main.yml in that role. To overcome this, I’d have to code the config values in the global scope as individual variables.
I’d value this as “capital punishment” regarding style.

Another thing I learned: it is now impossible to simply access another roles parameter because the are all called config. So assuming a backup-role I’d depend on, I could not simply access its backup-directory.

I do not know wether my dillemma is apparant from this description. What I am looking for is the best practice on “how to instantiate a role with specific configuration” with style and least redundant coding, optimally avoiding too much search&replace in the code.

Does that make sense? Is there a best practice I could adopt?
(Let me add … I am not a native English-speaker/-writer and I am pretty new to ansible)

Thanks in advance
Best regards
Koffeiniker