Update 3/31/2016: The implementation of the ini_file module described in this blogpost has been merged into Ansible version 2.0.
For editing Windows INI files, Ansible comes with an ini_file module built in. Unfortunately, this module uses Python’s ConfigParser module which reformats the entire INI file whenever you want to change a single line. It removes all the comment lines, too. For me this was not acceptable. After looking for a possible solution I decided to improve the ini_file module and created ini_file2. I realized how easy it is to create an Ansible module.
On Debian Linux, the Ansible’s built-in ini_file module can be found at /usr/share/ansible/files/ini_file. This file is the base for our own ini_file2. The question was, at what location should one store the ini_file2 module for Ansible to find it? From Ansible’s
documentation I learned that when looking for modules, Ansible searches the ./library directory alongside of the top level playbooks. That sounds perfect to me.
After a while working with the Python code, I created the ini_file2 module. This module provides an equivalent functionality to the original ini_file module, however, it does only the minimum changes when editing the INI file. It typically modifies only one line. When removing options, it doesn’t delete the lines but comment them out instead. If there was a commented out option it comments it in when required.
The ini_file and ini_file2 comparison
Let’s compare the ini_file and ini_file2 on a practical example. Our input INI file looks as follows:
| |
The Ansible test script will set the option1 and option2 to new_value and it will remove the option3 from the INI file:
| |
When using the original ini_file module, the resulting INI file looks like this:
| |
You can see that there’s not much left from the input file. All comments are gone. In contrast, the ini_file2 module does the editing operations with more precision:
| |
References
The ini_file2 source code as well as test scripts can be found at
GitHub.
