diff --git a/ansible.cfg b/ansible.cfg index a93ec40117cac78b8b42c28cb0a04d9b08c483cd..65b7d3f92956d671cf0d0c305d3dc67cac2d25bb 100644 --- a/ansible.cfg +++ b/ansible.cfg @@ -1,5 +1,6 @@ [defaults] inventory = hosts +library = library remote_tmp = $HOME/.ansible/tmp transport = smart remote_port = 22 diff --git a/library/dbscripts_mkdirs.py b/library/dbscripts_mkdirs.py new file mode 100644 index 0000000000000000000000000000000000000000..a9bbc45b2ee0ae394a022e28b4af5710e82c6d89 --- /dev/null +++ b/library/dbscripts_mkdirs.py @@ -0,0 +1,71 @@ +#!/usr/bin/python + +import errno +import grp +import os +import pwd +from stat import * + +# simple module that creates many directories for users +# initially created for dbscripts to create staging directories in the user homes + +def main(): + module = AnsibleModule( + argument_spec = dict( + permissions = dict(required=True), + users = dict(required=True, type='list'), + group = dict(required=True), + directories = dict(required=True, type='list'), + pathtmpl = dict(required=True), + ), + supports_check_mode=True, + ) + + users = module.params['users'] + directories = module.params['directories'] + permissions = int(module.params['permissions'], 8) + pathtmpl = module.params['pathtmpl'] + group = module.params['group'] + gid = grp.getgrnam(group).gr_gid + + changed = 0 + changed_dirs = [] + + for user in users: + uid = pwd.getpwnam(user).pw_uid + + for dirname in directories: + path = pathtmpl.format(**{"user": user, "dirname": dirname}) + + permissions_incorrect = True + dirmode = None + + if os.path.exists(path): + stat = os.stat(path) + dirmode = oct(stat.st_mode & 0777) + diruid = stat.st_uid + dirgid = stat.st_gid + permissions_incorrect = diruid != uid or dirgid != gid + + if not os.path.isdir(path) or dirmode != oct(permissions) or permissions_incorrect: + changed += 1 + changed_dirs.append(path) + + if not module.check_mode: + try: + try: + os.mkdir(path, permissions) + except OSError as ex: + if not (ex.errno == errno.EEXIST and os.path.isdir(path)): + raise + except Exception as e: + module.fail_json(path=path, msg='There was an issue creating %s as requested: %s' % (path, str(e))) + os.chmod(path, permissions) + os.chown(path, uid, gid) + + module.exit_json(changed=changed > 0, msg="%s directories changed" % (changed), changed_dirs=changed_dirs) + +from ansible.module_utils.basic import AnsibleModule +if __name__ == '__main__': + main() + diff --git a/roles/dbscripts/tasks/main.yml b/roles/dbscripts/tasks/main.yml index a9d45d8d487728f03bc6c4a6a9c2ff36eb1b03f5..080f54a0ac8a22b0841a6da5245454cf753207c0 100644 --- a/roles/dbscripts/tasks/main.yml +++ b/roles/dbscripts/tasks/main.yml @@ -57,10 +57,12 @@ tags: ['archusers'] - name: create staging directories in user homes - file: path=/home/{{item[0]}}/staging/{{item[1]}} state=directory owner={{item[0]}} group=users mode=0755 - with_nested: - - "{{arch_users}}" - - ['core', 'extra', 'testing', 'staging', 'community', 'community-staging', 'community-testing', 'multilib', 'multilib-staging', 'multilib-testing'] + dbscripts_mkdirs: + pathtmpl: '/home/{user}/staging/{dirname}' + permissions: 755 + directories: ['', 'core', 'extra', 'testing', 'staging', 'community', 'community-staging', 'community-testing', 'multilib', 'multilib-staging', 'multilib-testing'] + users: "{{arch_users.keys()}}" + group: users tags: ["archusers"] - name: create dbscripts paths