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 #39558pull/4420/head
parent
f75b7a9437
commit
4f664f8ff6
|
@ -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)
|
|
@ -354,7 +354,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:
|
||||||
|
@ -442,7 +441,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':
|
||||||
|
@ -475,5 +483,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…
Reference in New Issue