Ansible User module system parameter creates home directory
Ansible User module has a parameter named
system to create system user. It’s description says:
When creating an account state=present, setting this to yes makes the user a system account. This setting cannot be changed on existing users.
The code for this parameter is:
if self.system: cmd.append('-r')
Ansible user module uses
useradd command under the hood. The manpage of
-r option says:
Create a system account. System users will be created with no aging information in /etc/shadow, and their numeric identifiers are chosen in the SYS_UID_MIN-SYS_UID_MAX range, defined in /etc/login.defs, instead of UID_MIN-UID_MAX (and their GID counterparts for the creation of groups).
Note that useradd will not create a home directory for such a user, regardless of the default setting in /etc/login.defs (CREATE_HOME). You have to specify the -m options if you want a home directory for a system account to be created.
It clearly says that by default no home directory will be created for a system user. But if you create a user with following task
- name: create system user user: name: systemuser state: present system: true
A home directory will be created for systemuser in /home/systemuser. This is due to
create_home option which defaults to
true in user module. The
system parameter has no effect on
create_home option. So, the command used internally in ansible becomes
useradd -r -m /home/systemuser
An issue was created years ago to change this behavior, but was turned down as it would break existing playbooks which is pretty dumb in my opinion. In the meantime, if you want to create a system user with this module without creating home directory, you should use false to
create_home parameter explicitly
- name: create system user user: name: systemuser state: present system: true create_home: false
I’ve created an ansible role which you can use to manage users for your system. This uses system parameter but behaves as you’d expect and does not create home directory.