#!/usr/bin/env python # -*- coding: utf-8 -*- DOCUMENTATION = ''' --- module: json_file author: Daniele Baracchi short_description: Manipulate json files description: - Manipulate json files options: path: required: true description: - Path to the JSON file to be manipulated. key: required: true description: - Key to be checked. value: required: false description: - Value to set the key to. state: required: false default: "present" choices: [ "present", "absent" ] description: - Whether the key should exist or not, taking action if the state is different from what is stated. ''' import json import os.path from ansible.module_utils.basic import * class JsonFile(object): def __init__(self, path): self.path = path with open(path, 'r') as stream: self.contents = json.load(stream) def has_key(self, key): key_path = key.split('.') container = self.contents for part in key_path: if part in container: container = container[part] else: return False return True def has_pair(self, key, value): key_path = key.split('.') container = self.contents for part in key_path: if part in container: container = container[part] else: return False return container == value def drop_key(self, key): key_path = key.split('.') container = self.contents for part in key_path[:-1]: container = container[part] del container[key_path[-1]] def set_key(self, key, value): key_path = key.split('.') container = self.contents for part in key_path[:-1]: if part not in container: container[part] = {} container = container[part] container[key_path[-1]] = value def serialize(self): with open(self.path, 'w') as stream: json.dump(self.contents, stream, indent=4) def main(): module = AnsibleModule( argument_spec=dict( state=dict(default='present', choices=['present', 'absent'], type='str'), path=dict(required=True, type='str'), key=dict(required=True, type='str'), value=dict(default=None, type='str') ), supports_check_mode=True ) path = module.params.get('path') key = module.params.get('key') state = module.params.get('state') result = {} result['path'] = path result['key'] = key result['state'] = state if not os.path.exists(path): module.fail_json("File not found: %s" % path) the_file = JsonFile(path) if state == 'absent': if the_file.has_key(key): if module.check_mode: module.exit_json(changed=True) else: the_file.drop_key(key) the_file.serialize() result['changed'] = True elif state == 'present': value = module.params.get('value') result['value'] = value if not the_file.has_pair(key, value): if module.check_mode: module.exit_json(changed=True) else: the_file.set_key(key, value) the_file.serialize() result['changed'] = True module.exit_json(**result) if __name__ == '__main__': main()