# Module to determine home directory for a named user

**URL:** <https://forum.ansible.com/t/module-to-determine-home-directory-for-a-named-user/20924>\
**Category:** Ansible Developer\
**Created:** [March 18, 2016, 5:56pm UTC](https://forum.ansible.com/t/module-to-determine-home-directory-for-a-named-user/20924 "2016-03-18T17:56:13Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![Gordon\_Mckeown](https://avatars.discourse-cdn.com/v4/letter/g/3ab097/32.png) [@Gordon\_Mckeown](https://forum.ansible.com/u/Gordon_Mckeown)\
**Post date:** [March 18, 2016, 5:56pm UTC](https://forum.ansible.com/t/module-to-determine-home-directory-for-a-named-user/20924/1 "2016-03-18T17:56:13Z")

</div>

Hi all,

Have started playing around with Ansible over the last couple of days, and as part of my playbook to set up a new server I wanted to copy files to the home directories of some specific users. I couldn’t find an existing way of reliably determining user home directories – just grepping /etc/passwd isn’t quite enough – and so I knocked together a module to get this for me.

No idea if I’ve done things the “right” way, but thought the code might be useful to someone. Also would appreciate any critique or suggestions from those that know the system better. I’m more of a Perl and Java man, so I don’t promise my Python code is pretty or sensible.

Call method from inside a playbook is:

`

- name: Get user home directory  
userhomedir: loginid=targetuser  
register: user

- name: Debug info  
debug: msg=“Home directory for user {{ user.loginid }} is {{ user.dest }}”  
`

Module code:

`  
#!/usr/bin/python

# -------

# Imports

# -------

import sys, pwd, re  
from ansible.module\_utils.basic import \*

# --------------

# Define Globals

# --------------

module = AnsibleModule(  
argument\_spec = dict(  
loginid = dict(required=True, type=‘str’)  
)  
)

if sys.platform.startswith(‘linux’):  
default\_home = “/home”  
default\_useradd\_file = “/etc/default/useradd”  
default\_useradd\_entry = “HOME”

elif sys.platform.startswith(‘freebsd’):  
default\_home = “/home”  
default\_useradd\_file = “/etc/adduser.conf”  
default\_useradd\_entry = “homeprefix”

else:  
module.fail\_json(msg="Module does not know how to handle operating system " + sys.platform)

was\_useradd\_parsed = False

# ----------------

# Define Functions

# ----------------

def getDirFromPasswd(check\_username):  
pwd\_homedir = “”  
try:  
user\_entry = pwd.getpwnam(check\_username)  
pwd\_homedir = user\_entry[5]  
except:  
pass

return {‘method’: “Password File”, ‘directory’:pwd\_homedir}

def getDirFromUseradd(check\_username):  
global was\_useradd\_parsed  
def\_dir = “”  
home\_regex = “^” + re.escape(default\_useradd\_entry) + “=(.\*)”  
try:  
default\_file = open(default\_useradd\_file)  
was\_useradd\_parsed = True  
for line in default\_file:  
match = re.search(home\_regex, line)  
if match:  
def\_dir = match.group(1) + “/” + check\_username  
module.exit\_json(changed=False, loginid=“TEST”, homedir=chosen\_home[‘directory’], source=chosen\_home[‘method’], platform=sys.platform)  
break  
default\_file.close()  
except:  
pass

return {‘method’: “Useradd Default”, ‘directory’:def\_dir}

def getDirFromFallback(check\_username):  
assumed\_directory = default\_home + “/” + check\_username  
return {‘method’: “Fall-back”, ‘directory’: assumed\_directory}

# -------------

# Main Function

# -------------

def main():  
username = module.params[‘loginid’]

chosen\_home = getDirFromPasswd(username)

if chosen\_home[‘directory’] == “”:  
chosen\_home = getDirFromUseradd(username)

if chosen\_home[‘directory’] == “”:  
chosen\_home = getDirFromFallback(username)

module.exit\_json(changed=False, loginid=username, dest=chosen\_home[‘directory’], source=chosen\_home[‘method’], platform=sys.platform, useradd\_parsed=was\_useradd\_parsed)

# ------

# Run Me

# ------

if **name** == ‘ **main** ’:  
main()  
`

---

<div class="post-metadata">

**Author:** ![Brian\_Coca](https://avatars.discourse-cdn.com/v4/letter/b/6de8d8/32.png) [@Brian\_Coca](https://forum.ansible.com/u/Brian_Coca)\
**Post date:** [March 18, 2016, 7:06pm UTC](https://forum.ansible.com/t/module-to-determine-home-directory-for-a-named-user/20924/2 "2016-03-18T19:06:05Z")

</div>

You can already get this info:  
#\> ansible -m getent -a ‘database=passwd key=myuser’ localhost -vv

localhost | SUCCESS =\> {  
“ansible\_facts”: {  
“getent\_passwd”: {  
“myuser”: [  
“x”,  
“1000”,  
“100”,  
“My User”,  
“/home/myuser”,  
“/bin/bash”  
]  
}

---

<div class="post-metadata">

**Author:** ![Gordon\_Mckeown](https://avatars.discourse-cdn.com/v4/letter/g/3ab097/32.png) [@Gordon\_Mckeown](https://forum.ansible.com/u/Gordon_Mckeown)\
**Post date:** [March 18, 2016, 9:05pm UTC](https://forum.ansible.com/t/module-to-determine-home-directory-for-a-named-user/20924/3 "2016-03-18T21:05:14Z")

</div>

Great, thanks Brian, that’s really useful to know. Evidently my Google-fu failed me on this one since searching for “ansible getent” returns that module as the first result.

What I didn’t make clear is that my requirement is to determine the home directory for a user, and if that user doesn’t yet exist, provide an educated guess where their home folder would get created. This way I can pre-create the folder and stick authorized\_keys and whatever into it on a new machine even before I’ve logged on with a particular account.

Perhaps it’s a very unique requirement to my test lab, but as I said, I thought I’d share in case it’s useful. Also, any general feedback on the module will be helpful if I do create something that has wider application 🙂
