diff --git a/changelogs/fragments/user_freebsd_always_changed_bugfix.yaml b/changelogs/fragments/user_freebsd_always_changed_bugfix.yaml new file mode 100644 index 00000000000..c4d88abfd9d --- /dev/null +++ b/changelogs/fragments/user_freebsd_always_changed_bugfix.yaml @@ -0,0 +1,2 @@ +bugfixes: + - user - fix bug that resulted in module always reporting a change when specifiying the home directory on FreeBSD (https://github.com/ansible/ansible/issues/42484) diff --git a/lib/ansible/modules/system/user.py b/lib/ansible/modules/system/user.py index 032d72bc7e6..bb66323e923 100644 --- a/lib/ansible/modules/system/user.py +++ b/lib/ansible/modules/system/user.py @@ -1010,8 +1010,9 @@ class FreeBsdUser(User): if self.home is not None: if (info[5] != self.home and self.move_home) or (not os.path.exists(self.home) and self.create_home): cmd.append('-m') - cmd.append('-d') - cmd.append(self.home) + if info[5] != self.home: + cmd.append('-d') + cmd.append(self.home) if self.skeleton is not None: cmd.append('-k') diff --git a/test/integration/targets/user/tasks/main.yml b/test/integration/targets/user/tasks/main.yml index ee20aac5bea..329710cb781 100644 --- a/test/integration/targets/user/tasks/main.yml +++ b/test/integration/targets/user/tasks/main.yml @@ -37,7 +37,13 @@ user: name: ansibulluser state: present - register: user_test0 + register: user_test0_0 + +- name: create the user again + user: + name: ansibulluser + state: present + register: user_test0_1 - debug: var: user_test0 @@ -54,9 +60,50 @@ - name: validate results for testcase 0 assert: that: - - user_test0 is changed + - user_test0_0 is changed + - user_test0_1 is not changed - '"ansibulluser" in user_names.stdout_lines' +# https://github.com/ansible/ansible/issues/42484 +# Skipping macOS for now since there is a bug when changing home directory +- block: + - name: create user specifying home + user: + name: ansibulluser + state: present + home: "{{ user_home_prefix[ansible_system] }}/ansibulluser" + register: user_test3_0 + + - name: create user again specifying home + user: + name: ansibulluser + state: present + home: "{{ user_home_prefix[ansible_system] }}/ansibulluser" + register: user_test3_1 + + - name: change user home + user: + name: ansibulluser + state: present + home: "{{ user_home_prefix[ansible_system] }}/ansibulluser-mod" + register: user_test3_2 + + - name: change user home back + user: + name: ansibulluser + state: present + home: "{{ user_home_prefix[ansible_system] }}/ansibulluser" + register: user_test3_3 + + - name: validate results for testcase 3 + assert: + that: + - user_test3_0 is not changed + - user_test3_1 is not changed + - user_test3_2 is changed + - user_test3_3 is changed + when: ansible_system != 'Darwin' + ## user check @@ -65,7 +112,7 @@ name: "{{ user_names.stdout_lines | random }}" state: present create_home: no - with_sequence: start=1 end=5 + loop: "{{ range(1, 5+1) | list }}" register: user_test1 - debug: diff --git a/test/integration/targets/user/vars/main.yml b/test/integration/targets/user/vars/main.yml new file mode 100644 index 00000000000..f5d3b3f332b --- /dev/null +++ b/test/integration/targets/user/vars/main.yml @@ -0,0 +1,5 @@ +user_home_prefix: + Linux: '/home' + FreeBSD: '/home' + SunOS: '/home' + Darwin: '/Users'