diff --git a/lib/ansible/module_common.py b/lib/ansible/module_common.py index 8e221ad9e7..508fe93de1 100644 --- a/lib/ansible/module_common.py +++ b/lib/ansible/module_common.py @@ -797,7 +797,11 @@ class AnsibleModule(object): if self.selinux_enabled(): context = self.selinux_default_context(dest) self.set_context_if_different(src, context, False) - os.rename(src, dest) + try: + shutil.copy2(src, dest) + except shutil.Error, e: + self.fail_json(msg='Could not atomic_replace file: %s to %s: %s' % (src, dest, e)) + def run_command(self, args, check_rc=False, close_fds=False, executable=None, data=None): ''' diff --git a/library/cron b/library/cron index ebd3b6cb07..73eca78903 100644 --- a/library/cron +++ b/library/cron @@ -132,6 +132,7 @@ updates: Mike Grozak import re import tempfile +import os def get_jobs_file(module, user, tmpfile, cron_file): if cron_file: @@ -143,11 +144,19 @@ def get_jobs_file(module, user, tmpfile, cron_file): def install_jobs(module, user, tmpfile, cron_file): if cron_file: - cmd = "ln -f %s /etc/cron.d/%s" % (tmpfile, cron_file) + cron_file = '/etc/cron.d/%s' % cron_file + try: + module.atomic_replace(tmpfile, cron_file) + except (OSError, IOError), e: + return (1, "", str(e)) + except: + return (1, "", str(e)) + else: + return (0, "", "") + else: cmd = "crontab %s %s" % (user, tmpfile) - - return module.run_command(cmd) + return module.run_command(cmd) def get_jobs(tmpfile): lines = open(tmpfile).read().splitlines()