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