diff --git a/ansible/library/merge_configs b/ansible/library/merge_configs index b1baeb3d14370f130bc4b5ddfe0b834d1f1274c9..61d667be7f6c53e915dbecdcb858e8155732d0a1 100644 --- a/ansible/library/merge_configs +++ b/ansible/library/merge_configs @@ -14,9 +14,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -# TODO(SamYaple): Provide idempotency for module (Note to self: pull logic from -# pervious bslurp module in yaodu) - DOCUMENTATION = ''' --- module: merge_configs @@ -54,6 +51,8 @@ Merge multiple configs: ''' import ConfigParser +from hashlib import sha1 +from StringIO import StringIO def main(): module = AnsibleModule( @@ -67,17 +66,27 @@ def main(): sources = module.params.pop('sources') dest = module.params.pop('dest') + changed = False + dest_digest = None + fakedest = StringIO() + config = ConfigParser.ConfigParser() for source_file in sources: config.read(source_file) - with open(dest, 'wb') as dest_file: - config.write(dest_file) + if os.path.exists(dest) and os.access(dest, os.R_OK): + config.write(fakedest) + with open(dest, 'rb') as f: + dest_digest = sha1(f.read()).hexdigest() + + if dest_digest != sha1(fakedest.getvalue()).hexdigest(): + changed = True + with open(dest, 'wb') as f: + config.write(f) - module.exit_json(changed=True) + module.exit_json(changed=changed) except Exception, e: - changed = True module.exit_json(failed=True, changed=changed, msg=repr(e))