I'm trying to detect if a particular filesystem is mounted read-only or read-write on Linux (Ubuntu 16.04). Using the stat module won't work because it always returns the posix permissions regardless of the actual ability to write into the directory. I'm able to accomplish this with the rather intrusive and cumbersome code below, which attempts to create a dot file. I'd appreciate a cleaner and more elegant alternative, that can also detect if the directory is not a mount point (which would be an error).
- name: Determine whether we have write access to the shared dir
command: touch /mnt/shared-data/.WriteTest
register: shared_dir_write_test
failed_when: "shared_dir_write_test.rc != 0 and 'read-only' not in (shared_dir_write_test.stderr | lower)"
changed_when: shared_dir_write_test.rc == 0
Ansible advised me to use instead the file module with state=touch, however the code below fails since there doesn't seem to be a way to examine the interim result of file.
- name: Determine whether we have write access to the shared dir
file: path=/mnt/shared-data/.WriteTest state=touch
register: shared_dir_write_test
failed_when: "shared_dir_write_test.failed and 'read-only' not in (shared_dir_write_test.msg | lower)"
The conditional check 'shared_dir_write_test.failed and 'read-only' not in (shared_dir_write_test.stderr | lower)' failed. The error was: error while evaluating conditional (shared_dir_write_test.failed and 'read-only' not in (shared_dir_write_test.stderr | lower)): 'dict object' has no attribute 'failed'
You could gather Ansible facts, there are mount options for each mount:
sample output:
The information can be obtained from Ansible facts. Ansible code that accomplishes this:
Then to determine whether the mount is R/W or R/O I use:
or
Another, more terse but perhaps less clean approach that I used previously, was to obtain the information from /proc/self/mountinfo. A little more platform-specific than I hoped, but it only depends on documented intrefaces.
Then the expressions to determine whether the mount is R/W or R/O I would become a bit more cumbersome:
or