diff --git a/changelogs/fragments/206_fix_sysctl_to_work_on_symlinks.yml b/changelogs/fragments/206_fix_sysctl_to_work_on_symlinks.yml new file mode 100644 index 0000000..703a6a2 --- /dev/null +++ b/changelogs/fragments/206_fix_sysctl_to_work_on_symlinks.yml @@ -0,0 +1,3 @@ +--- +bugfixes: +- sysctl - fix sysctl to work properly on symlinks (https://github.com/ansible-collections/ansible.posix/issues/111). diff --git a/plugins/modules/sysctl.py b/plugins/modules/sysctl.py index 542b3c5..7914e9d 100644 --- a/plugins/modules/sysctl.py +++ b/plugins/modules/sysctl.py @@ -366,7 +366,7 @@ class SysctlModule(object): # Completely rewrite the sysctl file def write_sysctl(self): # open a tmp file - fd, tmp_path = tempfile.mkstemp('.conf', '.ansible_m_sysctl_', os.path.dirname(self.sysctl_file)) + fd, tmp_path = tempfile.mkstemp('.conf', '.ansible_m_sysctl_', os.path.dirname(os.path.realpath(self.sysctl_file))) f = open(tmp_path, "w") try: for l in self.fixed_lines: @@ -377,7 +377,7 @@ class SysctlModule(object): f.close() # replace the real one - self.module.atomic_move(tmp_path, self.sysctl_file) + self.module.atomic_move(tmp_path, os.path.realpath(self.sysctl_file)) # ============================================================== diff --git a/tests/integration/targets/sysctl/tasks/main.yml b/tests/integration/targets/sysctl/tasks/main.yml index 249bde1..ef5b86f 100644 --- a/tests/integration/targets/sysctl/tasks/main.yml +++ b/tests/integration/targets/sysctl/tasks/main.yml @@ -332,3 +332,37 @@ that: - sysctl_invalid_set1 is failed - "'vm.mmap_rnd_bits' not in sysctl_invalid_conf_content.stdout" + + # Test sysctl: sysctl_file is symlink + - name: Create link source + ansible.builtin.copy: + content: | + # Testing Ansible Sysctl module on symlink. + dest: /tmp/ansible_sysctl_test.conf + mode: "0644" + + - name: Create symlink to the conf file + ansible.builtin.file: + src: /tmp/ansible_sysctl_test.conf + dest: /tmp/ansible_sysctl_test_symlink.conf + state: link + + - name: Use sysctl module with symlink sysctl file + ansible.posix.sysctl: + name: 'kernel.randomize_va_space' + value: '1' + sysctl_file: /tmp/ansible_sysctl_test_symlink.conf + state: present + sysctl_set: false + reload: false + + - name: Stat sysctl file + ansible.builtin.stat: + path: /tmp/ansible_sysctl_test_symlink.conf + register: stat_result + + - name: Ensure the sysctl file remains a symlink + ansible.builtin.assert: + that: + - stat_result.stat.islnk is defined and stat_result.stat.islnk + - stat_result.stat.lnk_source == '/tmp/ansible_sysctl_test.conf'