diff --git a/README.md b/README.md index c215dbd..abcb469 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,8 @@ # module_availenabled -Ansible module to manage config directories and files - inspired by Debian's Apache configuration \ No newline at end of file +Ansible module to manage config directories and files - inspired by Debian's Apache configuration + +## Example + + ansible localhost -m availenabled -a "path=/tmp/apache2 base=mods- name=foo" + diff --git a/availenabled.py b/availenabled.py new file mode 100644 index 0000000..7db52e4 --- /dev/null +++ b/availenabled.py @@ -0,0 +1,81 @@ +#!/usr/bin/python + +import os +from operator import xor + +def main(): + module = AnsibleModule( + argument_spec = dict( + path = dict(required=True), + base = dict(default=""), + p_enabled = dict(default='enabled'), + p_available = dict(default='available'), + name = dict(required=True), + suffix= dict(default='.conf'), + state = dict(default='present', choices=['present', 'absent']), + ) + ) + + # path: /etc/apache2 or /etc/apache2/conf- + # base: conf- or "" + # name: FILENAME or FILENAME.conf + path = module.params.get('path') + base = module.params.get('base') + p_enabled = module.params.get('p_enabled') + p_available = module.params.get('p_available') + name = module.params.get('name') + suffix = module.params.get('suffix') + state = module.params.get('state') == 'present' + + # pre-checks + if os.path.isdir(path): + p_available = os.path.join(path, base + p_available) + p_enabled = os.path.join(path, base + p_enabled) + else: + p_available = path + p_available + p_enabled = path + p_enabled + + for p in [p_available, p_enabled]: + if not os.path.isdir(p): + module.fail_json(msg="Directory %s not found" % p) + + # define internal variables + src = os.path.join(p_available, name + suffix) + dest = os.path.join(p_enabled, name + suffix) + + if not (os.path.isfile(src) or os.path.islink(src)): + module.fail_json(msg="Source not found") + + dest_exists=True + if not (os.path.isfile(dest) or os.path.islink(dest)): + dest_exists=False + + # if there's no difference, no change, exit "ok" + if not xor(state, dest_exists): + module.exit_json() + + if state: + # try to create symlink + try: + os.symlink(os.path.relpath(src, p_enabled), dest) + except: + module.fail_json(msg="Could not create symlink") + else: + # test, if symlink + if not os.path.islink(dest): + module.fail_json(msg="Destination is not a symlink") + + # try to remove symlink + try: + os.unlink(dest) + except: + module.fail_json(msg="Could not remove symlink") + + module.exit_json(changed=True) + + + +from ansible.module_utils.basic import * +if __name__ == '__main__': + main() +