Playbooks to a new Lilik
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

148 lines
3.5 KiB

#!/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()