Externalization and Deduplication
Developers who understand the concepts of modularity and deduplication should immediately recognize the power behind being able to include settings and commands from external files. It is seriously counter-productive to maintain multiple scripts or playbooks that have large blocks of code or settings that are exactly the same. This is an anti-pattern.
Ansible is a wonderful tool, however it can often be implemented in counter-productive ways. Lets take variables for example.
Instead of maintaining a list of the same variables across multiple playbooks, it is better to use Variable File Separation.
The Ansible documentation provides an excellent example of how to do this. However I feel that the reasoning behind why you would want to do it falls short in describing the most common use-case, deduplication.
The documentation discusses the possible needs around security or information sensitivity. I also believe that deduplication should be added to that list. Productivity around how playbooks are managed can be significantly increased if implemented in a modular fashion using Variable File Separation, or vars_files. This by the way also goes for use of the includes_vars module.
Here are a list of reasons why you should immediately consider a deduplication project around your Ansible playbook variables:
Save Time Updating Multiple Files
This may seem like a no-brainer, but depending on the skills and experience of the person writing the playbook, this can become a significant hindrance to productivity. Because of Ansible’s agent-less and decentralized manner, playbooks can be written by anyone who wants to get started with systems automation. Often, these can be folks without significant proficiencies in programmer-oriented text editors such as Vim, Emacs, or Eclipse – or with bash scripting experience around command-line tools like awk, sed, and grep.
It is easy to imagine a Java developer without significant Linux command-line experience opening up one playbook at a time, and modifying the value for the same variable, over and over… and over again.
The best way for folks without ninja text-editing skills to stay productive is to deduplicate, and store common variables and tasks in external files that are referenced by multiple playbooks.
Prevent Bugs and Inconsistent Naming Conventions
In a perfect world, everyone would understand what a naming convention was. All our variables would be small enough to type quickly, clear enough to understand its purpose, and simple enough that there would never be a mis-spelling or type-o. This is rarely the case.
If left un-checked, SERVER_1_IP can also be SERVER1_IP, Server_1_IP, and server_1_ip. All different variable names across multiple files, referencing the same value for the exact same purpose.
This mess can be avoided by externalizing this information in a shared file.
Delegate Maintenance and Updates to Variables That Change Frequently
In some environments, there may be playbook variables that need to change frequently. If these variables are part of some large all-encompassing playbook that only some key administrators have access to be able to modify, your teams could be left waiting for your administrator to have free cycles available just to make a simple change. Again, deduplication and externalization to the rescue! Have these often-changing variables externalized so that users who need these changes immediately can go ahead and commit these changes to very specific, isolated files within your version control system that they have special rights to modify.
Cleaner Version Control History (and therefore Audit History)
If you have the same variables referenced by multiple files, and you make changes to each of those files before you commit them to version control, then your version control history can become a complete mess. Your version control history will show a change to a single value affecting multiple files. If you come from a software development background, and are familiar with the concept of code reviews, then you can appreciate being able to look at a simple change to a hard-coded value (or a constant), and see that it only affects one or two files.
I hope the reasons above convince some of you to start browsing your playbook repositories for possible candidates for deduplication. I really believe that such refactoring projects can boost productivity and execution speed for individuals and teams looking to push changes faster while minimizing obstacles around configurations shared by multiple systems. Send me a note if this inspires you to start your own deduplication project!