I am currently deploying a new product and came across some problems to structure my Playbook and Roles. I have three different solutions and hope to get some input which path might be the best.

The product is a webapp on a windows server. The following steps are needed to deploy (high level):

  • install javajdk
  • install tomcat
  • install win_service
  • configure java regkes
  • configure tomcat
  • install webapp
  • start service

I use static inventories for prod and staging, group_vars, roles (created with ansible-galaxy) so there is some kind of structure.

Solution 1 Put everything in one huge playbook. That does not sound well, but has the advantage that you know the variables from previous installations e.g. tomcat needs to know where JAVA_HOME is... that was with the javajdk installation, due to more than one java on the machines there is no global JAVA_HOME...

Solution 2 Break all out in small roles. Sounds great but roles should be independent from each other. I did not found a method to decouple tasks. Would it make sense to have single roles for e.g. install_tomcat, config_tomcat and set up a playbook which has the mentioned roles in sequence?

But how does one role know about, e.g. a path name which is needed in the next role. -> Installation sets the path, config needs to know.. I an really unsure to make roles independent.

Solution 3 Kind of solution 2. Have a main playbook which contains only roles, split as much as possible to roles. Have independent variable names in ./roles/vars/main.yml

Somehow(?) find a place higher in the variable precedence with the playbook where all needed var definitions go. Internally either path a variable to the role or simply over-rule a role variable.

E.g. a product has a service, the service name is generally part of a path name for tomcat. The tomcat name should not depend on the service, so there should be a tomcat_install_path in the role but also a service_name with the product. So in case the playbook for the product is called the service name should be part of the name, the tomcat_install is called with a total different deployment there should be no fiddling with a service name.

I would go with Solution 3 but I have not yet found a way to set that up. What is the experts opinion, is solution 3 doable, is one of the other once better or is there a 4th solution?


I would recommend to structure the code as defined in the Ansible Best Practices document:

enter image description here

and to follow the structure that major contributors to the ansible galaxy platform use, like geerlingguy.

If one will follow a significant different structure then it will be really hard in the future to reuse roles from the ansible galaxy community and one has to reinvent the wheel.

  • Thanks. And concrete in regards to my question: How will you decouple and reuse e.g. javajdk installation and the reuse of it in a tomcat installation? When they are decoupled than the variables e.g. pat to javaddk will need to be "in" the role. How do you handle this in a tomcat installation with out changing variables all over the place? Is there a common concept to use variable precedence? Is so which? – Michael Hoeller Nov 26 '17 at 15:40
  • I would check ansible galaxy and install a jdk and tomcat role. I will not write a role myself unless it is unavailable. For example, github.com/silpion/ansible-tomcat and ansiblebit.oracle-java – 030 Jan 4 '18 at 21:46
  • Note that I did not test the tomcat role. You could test the tomcat role locally. If that does not work, you could use another tomcat role from galaxy. – 030 Jan 4 '18 at 21:52

Short Answer: You do programming here. Consider Programming Standards (cleancode) like "package by feature" and build role which are reusable and express the reason of the role. e.g.

  - role: jdk
  - role: tomcat  
      (contains tasks with 'install tomcat', 'configure tomcat' ) 
      (requires jdk)
  - role: the_wepapp 
      (requires tomcat)

Futhermore: The underlying role e.g. the jdk should never know about the tomcat role etc...

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.