From 41e5b8428f6de9ace84a9639c2157eb57b9916b4 Mon Sep 17 00:00:00 2001 From: Adam Miller Date: Tue, 5 Jan 2021 17:23:15 -0600 Subject: [PATCH] mount return backup_file Fixes https://github.com/ansible-collections/ansible.posix/issues/126 Signed-off-by: Adam Miller --- .../126_mount_not_returning_backup_file.yml | 2 + plugins/modules/mount.py | 11 +- .../integration/targets/mount/tasks/main.yml | 241 ++++++++---------- 3 files changed, 123 insertions(+), 131 deletions(-) create mode 100644 changelogs/fragments/126_mount_not_returning_backup_file.yml diff --git a/changelogs/fragments/126_mount_not_returning_backup_file.yml b/changelogs/fragments/126_mount_not_returning_backup_file.yml new file mode 100644 index 0000000..b4746f4 --- /dev/null +++ b/changelogs/fragments/126_mount_not_returning_backup_file.yml @@ -0,0 +1,2 @@ +minor_changes: +- mount - returns ``backup_file`` value when a backup fstab is created. diff --git a/plugins/modules/mount.py b/plugins/modules/mount.py index dd7a5c0..e077ccf 100644 --- a/plugins/modules/mount.py +++ b/plugins/modules/mount.py @@ -171,7 +171,6 @@ EXAMPLES = r''' fstype: nfs ''' - import errno import os import platform @@ -184,8 +183,11 @@ from ansible.module_utils.parsing.convert_bool import boolean def write_fstab(module, lines, path): + if module.params['backup']: - module.backup_local(path) + backup_file = module.backup_local(path) + else: + backup_file = "" fs_w = open(path, 'w') @@ -195,6 +197,8 @@ def write_fstab(module, lines, path): fs_w.flush() fs_w.close() + return backup_file + def _escape_fstab(v): """Escape invalid characters in fstab fields. @@ -317,7 +321,7 @@ def _set_mount_save_old(module, args): changed = True if changed and not module.check_mode: - write_fstab(module, to_write, args['fstab']) + args['backup_file'] = write_fstab(module, to_write, args['fstab']) return (args['name'], old_lines, changed) @@ -692,6 +696,7 @@ def main(): if platform.system() == 'FreeBSD': args['opts'] = 'rw' + args['backup_file'] = "" linux_mounts = [] # Cache all mounts here in order we have consistent results if we need to diff --git a/tests/integration/targets/mount/tasks/main.yml b/tests/integration/targets/mount/tasks/main.yml index 7eacc59..56036b8 100644 --- a/tests/integration/targets/mount/tasks/main.yml +++ b/tests/integration/targets/mount/tasks/main.yml @@ -109,128 +109,110 @@ - unmount_result['changed'] - not dest_stat['stat']['exists'] when: ansible_system in ('FreeBSD', 'Linux') -- name: Create fstab record for the first swap file - mount: - name: none - src: /tmp/swap1 - opts: sw - fstype: swap - state: present - register: swap1_created - when: ansible_system in ('Linux') -- name: Try to create fstab record for the first swap file again - mount: - name: none - src: /tmp/swap1 - opts: sw - fstype: swap - state: present - register: swap1_created_again - when: ansible_system in ('Linux') -- name: Check that we created the swap1 record - assert: - that: - - swap1_created['changed'] - - not swap1_created_again['changed'] - when: ansible_system in ('Linux') -- name: Create fstab record for the second swap file - mount: - name: none - src: /tmp/swap2 - opts: sw - fstype: swap - state: present - register: swap2_created - when: ansible_system in ('Linux') -- name: Try to create fstab record for the second swap file again - mount: - name: none - src: /tmp/swap1 - opts: sw - fstype: swap - state: present - register: swap2_created_again - when: ansible_system in ('Linux') -- name: Check that we created the swap2 record - assert: - that: - - swap2_created['changed'] - - not swap2_created_again['changed'] - when: ansible_system in ('Linux') -- name: Remove the fstab record for the first swap file - mount: - name: none - src: /tmp/swap1 - state: absent - register: swap1_removed - when: ansible_system in ('Linux') -- name: Try to remove the fstab record for the first swap file again - mount: - name: none - src: /tmp/swap1 - state: absent - register: swap1_removed_again - when: ansible_system in ('Linux') -- name: Check that we removed the swap1 record - assert: - that: - - swap1_removed['changed'] - - not swap1_removed_again['changed'] - when: ansible_system in ('Linux') -- name: Remove the fstab record for the second swap file - mount: - name: none - src: /tmp/swap2 - state: absent - register: swap2_removed - when: ansible_system in ('Linux') -- name: Try to remove the fstab record for the second swap file again - mount: - name: none - src: /tmp/swap2 - state: absent - register: swap2_removed_again - when: ansible_system in ('Linux') -- name: Check that we removed the swap2 record - assert: - that: - - swap2_removed['changed'] - - not swap2_removed_again['changed'] - when: ansible_system in ('Linux') -- name: Create fstab record with missing last two fields - copy: - dest: /etc/fstab - content: '//nas/photo /home/jik/pictures cifs defaults,credentials=/etc/security/nas.creds,uid=jik,gid=users,forceuid,forcegid,noserverino,_netdev - - ' - when: ansible_system in ('Linux') -- name: Try to change the fstab record with the missing last two fields - mount: - src: //nas/photo - path: /home/jik/pictures - fstype: cifs - opts: defaults,credentials=/etc/security/nas.creds,uid=jik,gid=users,forceuid,forcegid,noserverino,_netdev,x-systemd.mount-timeout=0 - state: present - register: optional_fields_update - when: ansible_system in ('Linux') -- name: Get the content of the fstab file - shell: cat /etc/fstab - register: optional_fields_content - when: ansible_system in ('Linux') -- name: Check if the line containing the missing last two fields was changed - assert: - that: - - optional_fields_update['changed'] - - ''' 0 0'' in optional_fields_content.stdout' - - 1 == optional_fields_content.stdout_lines | length - when: ansible_system in ('Linux') - name: Block to test remounted option block: + - name: Create fstab record for the first swap file + mount: + name: none + src: /tmp/swap1 + opts: sw + fstype: swap + state: present + register: swap1_created + - name: Try to create fstab record for the first swap file again + mount: + name: none + src: /tmp/swap1 + opts: sw + fstype: swap + state: present + register: swap1_created_again + - name: Check that we created the swap1 record + assert: + that: + - swap1_created['changed'] + - not swap1_created_again['changed'] + - name: Create fstab record for the second swap file + mount: + name: none + src: /tmp/swap2 + opts: sw + fstype: swap + state: present + register: swap2_created + - name: Try to create fstab record for the second swap file again + mount: + name: none + src: /tmp/swap1 + opts: sw + fstype: swap + state: present + register: swap2_created_again + - name: Check that we created the swap2 record + assert: + that: + - swap2_created['changed'] + - not swap2_created_again['changed'] + - name: Remove the fstab record for the first swap file + mount: + name: none + src: /tmp/swap1 + state: absent + register: swap1_removed + - name: Try to remove the fstab record for the first swap file again + mount: + name: none + src: /tmp/swap1 + state: absent + register: swap1_removed_again + - name: Check that we removed the swap1 record + assert: + that: + - swap1_removed['changed'] + - not swap1_removed_again['changed'] + - name: Remove the fstab record for the second swap file + mount: + name: none + src: /tmp/swap2 + state: absent + register: swap2_removed + - name: Try to remove the fstab record for the second swap file again + mount: + name: none + src: /tmp/swap2 + state: absent + register: swap2_removed_again + - name: Check that we removed the swap2 record + assert: + that: + - swap2_removed['changed'] + - not swap2_removed_again['changed'] + - name: Create fstab record with missing last two fields + copy: + dest: /etc/fstab + content: '//nas/photo /home/jik/pictures cifs defaults,credentials=/etc/security/nas.creds,uid=jik,gid=users,forceuid,forcegid,noserverino,_netdev + + ' + - name: Try to change the fstab record with the missing last two fields + mount: + src: //nas/photo + path: /home/jik/pictures + fstype: cifs + opts: defaults,credentials=/etc/security/nas.creds,uid=jik,gid=users,forceuid,forcegid,noserverino,_netdev,x-systemd.mount-timeout=0 + state: present + register: optional_fields_update + - name: Get the content of the fstab file + shell: cat /etc/fstab + register: optional_fields_content + - name: Check if the line containing the missing last two fields was changed + assert: + that: + - optional_fields_update['changed'] + - ''' 0 0'' in optional_fields_content.stdout' + - 1 == optional_fields_content.stdout_lines | length - name: Create empty file command: dd if=/dev/zero of=/tmp/myfs.img bs=1048576 count=20 - when: ansible_system in ('Linux') - name: Format FS - when: ansible_system in ('Linux') community.general.system.filesystem: fstype: ext3 dev: /tmp/myfs.img @@ -240,44 +222,48 @@ src: /tmp/myfs.img fstype: ext2 state: mounted - when: ansible_system in ('Linux') - name: Get the last write time shell: 'dumpe2fs /tmp/myfs.img 2>/dev/null | grep -i last write time: |cut -d: -f2-' register: last_write_time - when: ansible_system in ('Linux') - name: Wait 2 second pause: seconds: 2 - when: ansible_system in ('Linux') - name: Test if the FS is remounted mount: path: /tmp/myfs state: remounted - when: ansible_system in ('Linux') - name: Get again the last write time shell: 'dumpe2fs /tmp/myfs.img 2>/dev/null | grep -i last write time: |cut -d: -f2-' register: last_write_time2 - when: ansible_system in ('Linux') - name: Fail if they are the same fail: msg: Filesytem was not remounted, testing of the module failed! - when: last_write is defined and last_write_time2 is defined and last_write_time.stdout == last_write_time2.stdout and ansible_system in ('Linux') + when: last_write is defined and last_write_time2 is defined and last_write_time.stdout == last_write_time2.stdout - name: Remount filesystem with different opts using remounted option (Linux only) mount: path: /tmp/myfs state: remounted opts: rw,noexec - when: ansible_system == 'Linux' - name: Get remounted options (Linux only) shell: mount | grep myfs | grep -E -w 'noexec' | wc -l register: remounted_options - when: ansible_system == 'Linux' - name: Make sure the filesystem now has the new opts after using remounted (Linux only) assert: that: - "'1' in remounted_options.stdout" - "1 == remounted_options.stdout_lines | length" - when: ansible_system == 'Linux' + - name: Mount the FS again to test backup + mount: + path: /tmp/myfs + src: /tmp/myfs.img + fstype: ext2 + state: mounted + backup: yes + register: mount_backup_out + - name: ensure backup_file in returned output + assert: + that: + - "'backup_file' in mount_backup_out" always: - name: Umount the test FS mount: @@ -285,7 +271,6 @@ src: /tmp/myfs.img opts: loop state: absent - when: ansible_system in ('Linux') - name: Remove the test FS file: path: '{{ item }}' @@ -293,4 +278,4 @@ loop: - /tmp/myfs.img - /tmp/myfs - when: ansible_system in ('Linux') + when: ansible_system in ('Linux')