Compare commits

...

19 commits

Author SHA1 Message Date
Yves MOYROUD
2244bcbd12
Merge d05a5c70b5 into f0b5f039d3 2025-04-14 11:05:46 +00:00
softwarefactory-project-zuul[bot]
f0b5f039d3
Merge pull request #613 from simonLeary42/rewrite-mount-tests
improve mount integration tests

SUMMARY

added check mode tests (assert no changes made)
added comments to make file less scary

ISSUE TYPE
tests
COMPONENT NAME
mount
ADDITIONAL INFORMATION

Reviewed-by: Abhijeet Kasurde
Reviewed-by: Hideki Saito <saito@fgrep.org>
2025-04-10 03:58:40 +00:00
Abhijeet Kasurde
eead50b287
Apply suggestions from code review 2025-03-26 12:36:08 -07:00
Simon Leary
4ff0e3aa13 remove assertion of changed 2025-03-26 15:20:42 -04:00
Simon Leary
979f00ce75 fix lint errors 2025-03-26 15:18:35 -04:00
Simon Leary
7d8da00f79 add (check mode) to task name 2025-03-06 10:46:57 -05:00
Simon Leary
f087d58cbe fix bugs 2025-03-05 00:39:46 +00:00
Simon Leary
eb740e97d4 add check mode tests, add comments 2025-03-05 00:33:11 +00:00
Yves MOYROUD
d05a5c70b5
Update 569_keep_mountpoint.yml
escape :
2024-10-11 17:24:52 +02:00
Yves MOYROUD
572167b9c1
Update mount.py
deleted trailing newlines
2024-10-11 17:10:24 +02:00
Yves MOYROUD
2c8aad9f39
Update 569_keep_mountpoint.yml
remove empty lines and vim comment
2024-10-11 16:58:01 +02:00
Yves MOYROUD
70b838f031
Add files via upload 2024-10-11 16:54:16 +02:00
Yves MOYROUD
5a16ef3bea
Add files via upload 2024-10-11 16:53:27 +02:00
Yves MOYROUD
841a0f3314
modules/mount.py 2024-10-11 16:46:26 +02:00
Yves MOYROUD
5bc6f636f7
Update mount.py
still a trailing whitespace
2024-10-04 09:08:03 +02:00
Yves MOYROUD
284025660c
delete trailing spaces in mount.py
delete trailing spaces in comments in mount.py
2024-10-03 17:27:18 +02:00
Yves MOYROUD
f7f54f242d
Update mount.py
suppressed erroneous remaining TOTO check
2024-10-03 13:32:42 +02:00
Yves MOYROUD
966df79767
Update mount.py
new option keep_mountpoint enables keeping the mountpoint with state=absent
2024-10-03 11:36:45 +02:00
Yves MOYROUD
5ee818ec86
Update mount.py
In function main(), remove rmdir in case if state == 'absent'.
Unmounting a file system should not lead to delete anything that is revealed after unmounting. 
Also, it leads to an error if a non empty directory is present under the ex-mountpoint after umount : [Errno 39] Directory not empty
So umount is successfull but the ansible run is failed. Of course, it is solved on second run.
2024-09-18 17:41:21 +02:00
3 changed files with 447 additions and 9 deletions

View file

@ -0,0 +1,3 @@
---
minor_changes:
- keep_mountpoint - added keep_mountpoint option with default value false. If set to true keep_mountpoint changes the behaviour of state\: absent by keeping the mountpoint.

View file

@ -87,7 +87,8 @@ options:
real source. V(absent) does not unmount recursively, and the module will real source. V(absent) does not unmount recursively, and the module will
fail if multiple devices are mounted on the same mount point. Using fail if multiple devices are mounted on the same mount point. Using
V(absent) with a mount point that is not registered in the I(fstab) has V(absent) with a mount point that is not registered in the I(fstab) has
no effect, use V(unmounted) instead. no effect, use V(unmounted) instead. You can set O(keep_mountpoint) to
True to keep the mountpoint.
- V(remounted) specifies that the device will be remounted for when you - V(remounted) specifies that the device will be remounted for when you
want to force a refresh on the mount itself (added in 2.9). This will want to force a refresh on the mount itself (added in 2.9). This will
always return RV(ignore:changed=true). If O(opts) is set, the options will be always return RV(ignore:changed=true). If O(opts) is set, the options will be
@ -132,6 +133,16 @@ options:
the original file back if you somehow clobbered it incorrectly. the original file back if you somehow clobbered it incorrectly.
type: bool type: bool
default: false default: false
keep_mountpoint:
description:
- Change the default behaviour of state=absent by keeping the mountpoint
- With keep_mountpoint=true, state=absent is like unmounted plus the
fstab update.
- Use it if you care about finding original mountpoint content without failing
and want to remove the entry in fstab. If you have no entry to clean in
fstab you can use state=unmounted
type: bool
default: false
notes: notes:
- As of Ansible 2.3, the O(name) option has been changed to O(path) as - As of Ansible 2.3, the O(name) option has been changed to O(path) as
default, but O(name) still works as well. default, but O(name) still works as well.
@ -175,6 +186,23 @@ EXAMPLES = r'''
path: /tmp/mnt-pnt path: /tmp/mnt-pnt
state: remounted state: remounted
# The following will fail on first run
# if /home/mydir is not empty after unmounting,
# though unmount and remove from fstab are successfull.
# It will be successfull on subsequent runs (already unmounted).
- name: Unmount and remove from fstab, then if unmount was necessary try to remove mountpoint /home/mydir
ansible.posix.mount:
path: /home/mydir
state: absent
# The following will not fail on first run
# if /home/mydir is not empty after unmounting.
# It will leave /home/mydir and its content (if any) after unmounting.
- name: Unmount and remove from fstab, but keep /home/mydir
ansible.posix.mount:
path: /home/mydir
state: absent
keep_mountpoint: true
# The following will not save changes to fstab, and only be temporary until # The following will not save changes to fstab, and only be temporary until
# a reboot, or until calling "state: unmounted" followed by "state: mounted" # a reboot, or until calling "state: unmounted" followed by "state: mounted"
# on the same "path" # on the same "path"
@ -779,6 +807,7 @@ def main():
src=dict(type='path'), src=dict(type='path'),
backup=dict(type='bool', default=False), backup=dict(type='bool', default=False),
state=dict(type='str', required=True, choices=['absent', 'absent_from_fstab', 'mounted', 'present', 'unmounted', 'remounted', 'ephemeral']), state=dict(type='str', required=True, choices=['absent', 'absent_from_fstab', 'mounted', 'present', 'unmounted', 'remounted', 'ephemeral']),
keep_mountpoint=dict(type='bool', default=False),
), ),
supports_check_mode=True, supports_check_mode=True,
required_if=( required_if=(
@ -896,7 +925,7 @@ def main():
module.fail_json( module.fail_json(
msg="Error unmounting %s: %s" % (name, msg)) msg="Error unmounting %s: %s" % (name, msg))
if os.path.exists(name): if os.path.exists(name) and module.params['keep_mountpoint'] is False:
try: try:
os.rmdir(name) os.rmdir(name)
except (OSError, IOError) as e: except (OSError, IOError) as e:

View file

@ -1,3 +1,4 @@
# SETUP ################################################################################
- name: Install dependencies (Linux) - name: Install dependencies (Linux)
ansible.builtin.package: ansible.builtin.package:
name: e2fsprogs name: e2fsprogs
@ -110,6 +111,42 @@
mode: '0644' mode: '0644'
register: orig_info register: orig_info
# BIND MOUNT ################################################################################
# bind mount check mode
- name: Bind mount a filesystem (Linux) (check mode)
ansible.posix.mount:
src: '{{ output_dir }}/mount_source'
name: '{{ output_dir }}/mount_dest'
state: mounted
fstype: None
opts: bind
when: ansible_system == 'Linux'
register: bind_result_linux_dry_run
check_mode: true
- name: Bind mount a filesystem (FreeBSD) (check mode)
ansible.posix.mount:
src: '{{ output_dir }}/mount_source'
name: '{{ output_dir }}/mount_dest'
state: mounted
fstype: nullfs
when: ansible_system == 'FreeBSD'
register: bind_result_freebsd_dry_run
check_mode: true
- name: Attempt to stat bind mounted file
ansible.builtin.stat:
path: '{{ output_dir }}/mount_dest/test_file'
when: ansible_system in ('FreeBSD', 'Linux')
register: dest_stat
- name: Assert the bind mount did not take place
ansible.builtin.assert:
that:
- not dest_stat['stat']['exists']
when: ansible_system in ('FreeBSD', 'Linux')
# bind mount
- name: Bind mount a filesystem (Linux) - name: Bind mount a filesystem (Linux)
ansible.posix.mount: ansible.posix.mount:
src: '{{ output_dir }}/mount_source' src: '{{ output_dir }}/mount_source'
@ -168,6 +205,48 @@
- (ansible_system == 'Linux' and not bind_result_linux['changed']) or (ansible_system == 'FreeBSD' and not bind_result_freebsd['changed']) - (ansible_system == 'Linux' and not bind_result_linux['changed']) or (ansible_system == 'FreeBSD' and not bind_result_freebsd['changed'])
when: ansible_system in ('FreeBSD', 'Linux') when: ansible_system in ('FreeBSD', 'Linux')
# remount check mode
- name: Remount filesystem with different opts (Linux) (check mode)
ansible.posix.mount:
src: '{{ output_dir }}/mount_source'
name: '{{ output_dir }}/mount_dest'
state: mounted
fstype: None
opts: bind,ro
when: ansible_system == 'Linux'
register: bind_result_linux
check_mode: true
- name: Remount filesystem with different opts (FreeBSD) (check mode)
ansible.posix.mount:
src: '{{ output_dir }}/mount_source'
name: '{{ output_dir }}/mount_dest'
state: mounted
fstype: nullfs
opts: ro
when: ansible_system == 'FreeBSD'
register: bind_result_freebsd
check_mode: true
- name: Get mount options
ansible.builtin.shell:
cmd: set -o pipefail && mount | grep mount_dest | grep -c -E -w '(ro|read-only)'
executable: "{{ shell_executable }}"
changed_when: false
failed_when: false
register: new_options_count
- name: Make sure the filesystem does not have the new opts
ansible.builtin.assert:
that:
- linux_and_changed or freebsd_and_changed
- new_options_count.stdout | int == 0
vars:
linux_and_changed: "{{ ansible_system == 'Linux' and bind_result_linux_dry_run['changed'] }}"
freebsd_and_changed: "{{ ansible_system == 'FreeBSD' and bind_result_freebsd['changed'] }}"
when: ansible_system in ('FreeBSD', 'Linux')
# remount
- name: Remount filesystem with different opts (Linux) - name: Remount filesystem with different opts (Linux)
ansible.posix.mount: ansible.posix.mount:
src: '{{ output_dir }}/mount_source' src: '{{ output_dir }}/mount_source'
@ -203,6 +282,29 @@
- 1 == remount_options.stdout_lines | length - 1 == remount_options.stdout_lines | length
when: ansible_system in ('FreeBSD', 'Linux') when: ansible_system in ('FreeBSD', 'Linux')
# unmount check mode
- name: Unmount the bind mount (check mode)
ansible.posix.mount:
name: '{{ output_dir }}/mount_dest'
state: absent
when: ansible_system in ('Linux', 'FreeBSD')
register: unmount_result
check_mode: true
- name: Make sure the file still exists in dest
ansible.builtin.stat:
path: '{{ output_dir }}/mount_dest/test_file'
when: ansible_system in ('FreeBSD', 'Linux')
register: dest_stat
- name: Check that we did not unmount
ansible.builtin.assert:
that:
- unmount_result['changed']
- dest_stat['stat']['exists']
when: ansible_system in ('FreeBSD', 'Linux')
# unmount
- name: Unmount the bind mount - name: Unmount the bind mount
ansible.posix.mount: ansible.posix.mount:
name: '{{ output_dir }}/mount_dest' name: '{{ output_dir }}/mount_dest'
@ -223,9 +325,36 @@
- not dest_stat['stat']['exists'] - not dest_stat['stat']['exists']
when: ansible_system in ('FreeBSD', 'Linux') when: ansible_system in ('FreeBSD', 'Linux')
- name: Block to test remounted option # SWAP #############################################################
- name: Swap
when: ansible_system in ('Linux') when: ansible_system in ('Linux')
block: block:
# mount swap check mode
- name: Stat /etc/fstab
ansible.builtin.stat:
path: /etc/fstab
register: stat_fstab_before
- name: Create fstab record for the first swap file (check mode)
ansible.posix.mount:
name: none
src: /tmp/swap1
opts: sw
fstype: swap
state: present
check_mode: true
- name: Stat /etc/fstab
ansible.builtin.stat:
path: /etc/fstab
register: stat_fstab_after
- name: Assert that fstab checksum did not change
ansible.builtin.assert:
that:
- stat_fstab_before.stat.checksum == stat_fstab_after.stat.checksum
# mount swap1
- name: Create fstab record for the first swap file - name: Create fstab record for the first swap file
ansible.posix.mount: ansible.posix.mount:
name: none name: none
@ -250,6 +379,7 @@
- swap1_created['changed'] - swap1_created['changed']
- not swap1_created_again['changed'] - not swap1_created_again['changed']
# mount swap2
- name: Create fstab record for the second swap file - name: Create fstab record for the second swap file
ansible.posix.mount: ansible.posix.mount:
name: none name: none
@ -274,6 +404,30 @@
- swap2_created['changed'] - swap2_created['changed']
- not swap2_created_again['changed'] - not swap2_created_again['changed']
# remove swap check mode
- name: Stat /etc/fstab
ansible.builtin.stat:
path: /etc/fstab
register: stat_fstab_before
- name: Remove the fstab record for the first swap file (check mode)
ansible.posix.mount:
name: none
src: /tmp/swap1
state: absent
check_mode: true
- name: Stat /etc/fstab
ansible.builtin.stat:
path: /etc/fstab
register: stat_fstab_after
- name: Assert that fstab checksum did not change
ansible.builtin.assert:
that:
- stat_fstab_before.stat.checksum == stat_fstab_after.stat.checksum
# remove swap1
- name: Remove the fstab record for the first swap file - name: Remove the fstab record for the first swap file
ansible.posix.mount: ansible.posix.mount:
name: none name: none
@ -294,6 +448,7 @@
- swap1_removed['changed'] - swap1_removed['changed']
- not swap1_removed_again['changed'] - not swap1_removed_again['changed']
# remove swap2
- name: Remove the fstab record for the second swap file - name: Remove the fstab record for the second swap file
ansible.posix.mount: ansible.posix.mount:
name: none name: none
@ -314,6 +469,10 @@
- swap2_removed['changed'] - swap2_removed['changed']
- not swap2_removed_again['changed'] - not swap2_removed_again['changed']
# FIXUP #############################################################
- name: Fix incomplete entry already present in fstab
when: ansible_system == 'Linux'
block:
- name: Create fstab record with missing last two fields - name: Create fstab record with missing last two fields
ansible.builtin.copy: ansible.builtin.copy:
dest: /etc/fstab dest: /etc/fstab
@ -343,6 +502,11 @@
- ''' 0 0'' in optional_fields_content.stdout' - ''' 0 0'' in optional_fields_content.stdout'
- 1 == optional_fields_content.stdout_lines | length - 1 == optional_fields_content.stdout_lines | length
# REMOUNTED #############################################################
- name: Block to test remounted option
when: ansible_system in ('Linux')
block:
# setup
- name: Create empty file - name: Create empty file
community.general.filesize: community.general.filesize:
path: /tmp/myfs.img path: /tmp/myfs.img
@ -372,6 +536,26 @@
ansible.builtin.pause: ansible.builtin.pause:
seconds: 2 seconds: 2
# remount check mode
- name: Remount (check mode)
ansible.posix.mount:
path: /tmp/myfs
state: remounted
- name: Get again the last write time
ansible.builtin.shell:
cmd: >-
set -o pipefail && dumpe2fs /tmp/myfs.img 2>/dev/null | grep -i "last write time:" |cut -d: -f2-
executable: "{{ shell_executable }}"
changed_when: false
register: last_write_time_check
- name: Fail if they are different
ansible.builtin.fail:
msg: Filesytem was remounted, testing of the module failed!
when: last_write_time.stdout != last_write_time_check.stdout
# remount
- name: Test if the FS is remounted - name: Test if the FS is remounted
ansible.posix.mount: ansible.posix.mount:
path: /tmp/myfs path: /tmp/myfs
@ -390,6 +574,29 @@
msg: Filesytem was not remounted, testing of the module failed! 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 when: last_write is defined and last_write_time2 is defined and last_write_time.stdout == last_write_time2.stdout
# remount different options check mode
- name: Remount filesystem with different opts using remounted option (Linux only)
ansible.posix.mount:
path: /tmp/myfs
state: remounted
opts: rw,noexec
check_mode: true
- name: Get remounted options (Linux only)
ansible.builtin.shell:
cmd: set -o pipefail && mount | grep myfs | grep -E -w 'noexec' | wc -l
executable: "{{ shell_executable }}"
failed_when: false
changed_when: false
register: remounted_options
- name: Make sure the filesystem now has the new opts after using remounted (Linux only)
ansible.builtin.assert:
that:
- "'0' in remounted_options.stdout"
- "1 == remounted_options.stdout_lines | length"
# remount different options
- name: Remount filesystem with different opts using remounted option (Linux only) - name: Remount filesystem with different opts using remounted option (Linux only)
ansible.posix.mount: ansible.posix.mount:
path: /tmp/myfs path: /tmp/myfs
@ -409,6 +616,7 @@
- "'1' in remounted_options.stdout" - "'1' in remounted_options.stdout"
- "1 == remounted_options.stdout_lines | length" - "1 == remounted_options.stdout_lines | length"
# backup
- name: Mount the FS again to test backup - name: Mount the FS again to test backup
ansible.posix.mount: ansible.posix.mount:
path: /tmp/myfs path: /tmp/myfs
@ -439,9 +647,11 @@
- /tmp/myfs.img - /tmp/myfs.img
- /tmp/myfs - /tmp/myfs
# BOOT #############################################################
- name: Block to test boot option for Linux - name: Block to test boot option for Linux
when: ansible_system in ('Linux') when: ansible_system in ('Linux')
block: block:
# setup
- name: Create empty file - name: Create empty file
community.general.filesize: community.general.filesize:
path: /tmp/myfs.img path: /tmp/myfs.img
@ -452,6 +662,7 @@
fstype: ext3 fstype: ext3
dev: /tmp/myfs.img dev: /tmp/myfs.img
# noauto
- name: Mount the FS with noauto option - name: Mount the FS with noauto option
ansible.posix.mount: ansible.posix.mount:
path: /tmp/myfs path: /tmp/myfs
@ -472,6 +683,7 @@
path: /tmp/myfs path: /tmp/myfs
state: absent state: absent
# noauto + defaults
- name: Mount the FS with noauto option and defaults - name: Mount the FS with noauto option and defaults
ansible.posix.mount: ansible.posix.mount:
path: /tmp/myfs path: /tmp/myfs
@ -499,6 +711,7 @@
- /tmp/myfs.img - /tmp/myfs.img
- /tmp/myfs - /tmp/myfs
# NEWLINE END OF FILE ############################################
- name: Block to test missing newline at the EOF of fstab - name: Block to test missing newline at the EOF of fstab
when: ansible_system in ('Linux') when: ansible_system in ('Linux')
block: block:
@ -537,6 +750,7 @@
- /tmp/myfs1 - /tmp/myfs1
- /tmp/test_fstab - /tmp/test_fstab
# EPHEMERAL ################################################
- name: Block to test ephemeral option - name: Block to test ephemeral option
environment: environment:
PATH: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin PATH: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
@ -552,8 +766,7 @@
path: /tmp/myfs_B.img path: /tmp/myfs_B.img
size: 20M size: 20M
##### FORMAT FS ON LINUX ##### FORMAT FS ON LINUX
- name: Block to format FS on Linux - name: Block to format FS on Linux
when: ansible_system == 'Linux' when: ansible_system == 'Linux'
block: block:
@ -567,8 +780,7 @@
fstype: ext3 fstype: ext3
dev: /tmp/myfs_B.img dev: /tmp/myfs_B.img
##### FORMAT FS ON SOLARIS AND BSD ##### FORMAT FS ON SOLARIS AND BSD
- name: Create loop devices on Solaris and BSD - name: Create loop devices on Solaris and BSD
ansible.builtin.shell: ansible.builtin.shell:
cmd: "set -o pipefail && {{ ephemeral_create_loop_dev_cmd }}" cmd: "set -o pipefail && {{ ephemeral_create_loop_dev_cmd }}"
@ -583,14 +795,49 @@
changed_when: true changed_when: true
when: ephemeral_format_fs_cmd is defined when: ephemeral_format_fs_cmd is defined
##### TESTS
- name: Create fstab if it does not exist - name: Create fstab if it does not exist
ansible.builtin.file: ansible.builtin.file:
path: "{{ ephemeral_fstab }}" path: "{{ ephemeral_fstab }}"
state: touch state: touch
mode: '0644' mode: '0644'
# normal ephemeral mount check mode
- name: Get checksum of /etc/fstab before mounting anything
ansible.builtin.stat:
path: '{{ ephemeral_fstab }}'
register: fstab_stat_before_mount
- name: Mount the FS A with ephemeral state (check mode)
ansible.posix.mount:
path: /tmp/myfs
src: '{{ ephemeral_device_a }}'
fstype: '{{ ephemeral_fstype }}'
opts: rw
state: ephemeral
register: ephemeral_mount_info
check_mode: true
- name: Get checksum of /etc/fstab after an ephemeral mount
ansible.builtin.stat:
path: '{{ ephemeral_fstab }}'
register: fstab_stat_after_mount
- name: Get mountinfo
ansible.builtin.shell:
cmd: grep -c '/tmp/myfs' <(mount -v)
executable: "{{ shell_executable }}"
register: check_mountinfo
failed_when: false
changed_when: false
- name: Assert the mount occurred and the fstab is unchanged
ansible.builtin.assert:
that:
- check_mountinfo.stdout|int == 0
- ephemeral_mount_info['changed']
- fstab_stat_before_mount['stat']['checksum'] == fstab_stat_after_mount['stat']['checksum']
# normal ephemeral mount
- name: Get checksum of /etc/fstab before mounting anything - name: Get checksum of /etc/fstab before mounting anything
ansible.builtin.stat: ansible.builtin.stat:
path: '{{ ephemeral_fstab }}' path: '{{ ephemeral_fstab }}'
@ -631,6 +878,48 @@
- ephemeral_mount_info['changed'] - ephemeral_mount_info['changed']
- fstab_stat_before_mount['stat']['checksum'] == fstab_stat_after_mount['stat']['checksum'] - fstab_stat_before_mount['stat']['checksum'] == fstab_stat_after_mount['stat']['checksum']
# remount different options check mode
- name: Get first mount record
ansible.builtin.shell:
cmd: grep '/tmp/myfs' <(mount -v)
executable: "{{ shell_executable }}"
register: ephemeral_mount_record_1
changed_when: false
- name: Try to mount FS A where FS A is already mounted (should trigger remount and changed)
ansible.posix.mount:
path: /tmp/myfs
src: '{{ ephemeral_device_a }}'
fstype: '{{ ephemeral_fstype }}'
opts: ro
state: ephemeral
register: ephemeral_mount_info
check_mode: true
- name: Get second mount record (should be different than the first)
ansible.builtin.shell:
cmd: grep '/tmp/myfs' <(mount -v)
executable: "{{ shell_executable }}"
register: ephemeral_mount_record_2
changed_when: false
- name: Get mountinfo
ansible.builtin.shell:
cmd: grep -c '/tmp/myfs' <(mount -v)
executable: "{{ shell_executable }}"
failed_when: false
register: check_mountinfo
changed_when: false
- name: Assert the FS A is still mounted, the options unchanged and the fstab unchanged
ansible.builtin.assert:
that:
- check_mountinfo.stdout|int == 1
- ephemeral_mount_record_1.stdout == ephemeral_mount_record_2.stdout
- ephemeral_mount_info['changed']
- fstab_stat_before_mount['stat']['checksum'] == fstab_stat_after_mount['stat']['checksum']
# remount different options
- name: Get first mount record - name: Get first mount record
ansible.builtin.shell: ansible.builtin.shell:
cmd: grep '/tmp/myfs' <(mount -v) cmd: grep '/tmp/myfs' <(mount -v)
@ -670,6 +959,7 @@
- ephemeral_mount_info['changed'] - ephemeral_mount_info['changed']
- fstab_stat_before_mount['stat']['checksum'] == fstab_stat_after_mount['stat']['checksum'] - fstab_stat_before_mount['stat']['checksum'] == fstab_stat_after_mount['stat']['checksum']
# conflicting mount
- name: Try to mount file B on file A mountpoint (should fail) - name: Try to mount file B on file A mountpoint (should fail)
ansible.posix.mount: ansible.posix.mount:
path: /tmp/myfs path: /tmp/myfs
@ -707,6 +997,39 @@
- test_file_stat['stat']['exists'] - test_file_stat['stat']['exists']
- ephemeral_mount_b_info is failed - ephemeral_mount_b_info is failed
# unmount check mode
- name: Unmount FS with state = unmounted
ansible.posix.mount:
path: /tmp/myfs
state: unmounted
check_mode: true
- name: Get fstab checksum after unmounting an ephemeral mount with state = unmounted
ansible.builtin.stat:
path: '{{ ephemeral_fstab }}'
register: fstab_stat_after_unmount
- name: Get mountinfo
ansible.builtin.shell:
cmd: grep -c '/tmp/myfs' <(mount -v)
executable: "{{ shell_executable }}"
register: check_mountinfo
failed_when: false
changed_when: false
- name: Try to stat our test file
ansible.builtin.stat:
path: /tmp/myfs/test_file
register: test_file_stat
- name: Assert that unmount did not take place and fstab unchanged
ansible.builtin.assert:
that:
- check_mountinfo.stdout|int == 1
- test_file_stat['stat']['exists']
- fstab_stat_before_mount['stat']['checksum'] == fstab_stat_after_unmount['stat']['checksum']
# unmount
- name: Unmount FS with state = unmounted - name: Unmount FS with state = unmounted
ansible.posix.mount: ansible.posix.mount:
path: /tmp/myfs path: /tmp/myfs
@ -759,6 +1082,7 @@
- /tmp/myfs_B.img - /tmp/myfs_B.img
- /tmp/myfs - /tmp/myfs
# OPTS_NO_LOG ######################################
- name: Block to test opts_no_log option - name: Block to test opts_no_log option
when: ansible_system == 'Linux' when: ansible_system == 'Linux'
block: block:
@ -808,3 +1132,85 @@
loop: loop:
- /tmp/myfs.img - /tmp/myfs.img
- /tmp/myfs - /tmp/myfs
- name: Block to test keep_mountpoint option
block:
- name: Create the mount point
ansible.builtin.file:
state: directory
path: '/tmp/myfs'
mode: '0755'
- name: Create empty file for FS aaa
community.general.filesize:
path: /tmp/myfs.img
size: 20M
- name: Format FS bbb
community.general.filesystem:
fstype: xfs
dev: /tmp/myfs.img
- name: Put data in the mount point before mounting
ansible.builtin.copy:
content: 'Testing
This is the data before mounting
'
dest: '/tmp/myfs/test_file'
mode: '0644'
register: file_before_info
- name: Mount with fstab
ansible.posix.mount:
path: '/tmp/myfs'
fstype: xfs
state: mounted
src: '/tmp/myfs.img'
- name: Check data disappears - stat data
ansible.builtin.stat:
path: '/tmp/myfs/test_file'
register: file_stat_after_mount
- name: Check data disappears - file does not exist
ansible.builtin.assert:
that:
- file_stat_after_mount['stat']['exists'] == false
- name: Put data in the mount point after mounting
ansible.builtin.copy:
content: 'Testing
This is the data updated after mounting
'
dest: '/tmp/myfs/test_file'
mode: '0644'
register: file_after_info
- name: Umount with keep_mountpoint
ansible.posix.mount:
path: '/tmp/myfs'
fstype: xfs
state: absent
keep_mountpoint: true
- name: Check original data reappears - stat data
ansible.builtin.stat:
path: '/tmp/myfs/test_file'
register: file_stat_after_umount
- name: Check original data reappears - compare checksums
ansible.builtin.assert:
that:
- file_stat_after_umount['stat']['checksum'] == file_before_info['checksum']
always:
- name: Remove the first test file
ansible.builtin.file:
path: /tmp/myfs/test_file
state: absent
- name: Unmount FS
ansible.posix.mount:
path: /tmp/myfs
state: absent
- name: Remove the test FS and the second test file
ansible.builtin.file:
path: '{{ item }}'
state: absent
loop:
- /tmp/myfs/test_file
- /tmp/myfs.img
- /tmp/myfs