Fix for file module with symlinks to nonexistent target (#39635)

* Fix for file module with symlinks to nonexistent target

When creating a symlink to a nonexistent target, creating the symlink
would work but subsequent runs of the task would fail because it was
trying to operate on the target instead of the symlink.

Fixes #39558

(cherry picked from commit 4f664f8ff6)
pull/39735/head
Toshio Kuratomi 7 years ago
parent 99f36c6ce5
commit 3b17141525

@ -0,0 +1,5 @@
---
bugfixes:
- file module - Fix error when running a task which assures a symlink to
a nonexistent file exists for the second and subsequent times
(https://github.com/ansible/ansible/issues/39558)

@ -352,7 +352,6 @@ def main():
module.exit_json(path=path, changed=changed, diff=diff) module.exit_json(path=path, changed=changed, diff=diff)
elif state in ('link', 'hard'): elif state in ('link', 'hard'):
if not os.path.islink(b_path) and os.path.isdir(b_path): if not os.path.islink(b_path) and os.path.isdir(b_path):
relpath = path relpath = path
else: else:
@ -436,7 +435,16 @@ def main():
if module.check_mode and not os.path.exists(b_path): if module.check_mode and not os.path.exists(b_path):
module.exit_json(dest=path, src=src, changed=changed, diff=diff) module.exit_json(dest=path, src=src, changed=changed, diff=diff)
changed = module.set_fs_attributes_if_different(file_args, changed, diff, expand=False) # Whenever we create a link to a nonexistent target we know that the nonexistent target
# cannot have any permissions set on it. Skip setting those and emit a warning (the user
# can set follow=False to remove the warning)
if (state == 'link' and params['follow'] and os.path.islink(params['path']) and
not os.path.exists(file_args['path'])):
module.warn('Cannot set fs attributes on a non-existent symlink target. follow should be'
' set to False to avoid this.')
else:
changed = module.set_fs_attributes_if_different(file_args, changed, diff, expand=False)
module.exit_json(dest=path, src=src, changed=changed, diff=diff) module.exit_json(dest=path, src=src, changed=changed, diff=diff)
elif state == 'touch': elif state == 'touch':
@ -469,5 +477,6 @@ def main():
module.fail_json(path=path, msg='unexpected position reached') module.fail_json(path=path, msg='unexpected position reached')
if __name__ == '__main__': if __name__ == '__main__':
main() main()

@ -303,6 +303,15 @@
that: that:
- "file13_result.changed == true" - "file13_result.changed == true"
- name: Prove idempotence of force creation soft link to non existent
file: src=/noneexistent dest={{output_dir}}/soft2.txt state=link force=yes
register: file13a_result
- name: verify that the link to nonexistent is idempotent
assert:
that:
- "file13a_result.changed == false"
- name: remove directory foobar - name: remove directory foobar
file: path={{output_dir}}/foobar state=absent file: path={{output_dir}}/foobar state=absent
register: file14_result register: file14_result

Loading…
Cancel
Save