Ansible:检测Linux文件系统是否以只读方式装载

Ansible:检测Linux文件系统是否以只读方式装载,ansible,ubuntu-16.04,readonly,ansible-2.x,mount-point,Ansible,Ubuntu 16.04,Readonly,Ansible 2.x,Mount Point,我试图检测Linux(Ubuntu16.04)上是否以只读或读写方式安装了特定的文件系统。使用stat模块将不起作用,因为它总是返回posix权限,而不管写入目录的实际能力如何。我可以用下面的代码来完成这项工作,这些代码试图创建一个点文件。我希望有一个更干净、更优雅的替代方案,它还可以检测目录是否不是挂载点(这将是一个错误) Ansible建议我使用state=touch的文件模块,但是下面的代码失败了,因为似乎没有办法检查文件的临时结果 条件检查“shared\u dir\u write\u

我试图检测Linux(Ubuntu16.04)上是否以只读或读写方式安装了特定的文件系统。使用stat模块将不起作用,因为它总是返回posix权限,而不管写入目录的实际能力如何。我可以用下面的代码来完成这项工作,这些代码试图创建一个点文件。我希望有一个更干净、更优雅的替代方案,它还可以检测目录是否不是挂载点(这将是一个错误)

Ansible建议我使用state=touch的文件模块,但是下面的代码失败了,因为似乎没有办法检查文件的临时结果

条件检查“shared\u dir\u write\u test.failed”和“read-only” 不在(共享目录写入测试文件较低)失败。错误是: 计算条件(共享\u目录\u写入\u测试)时出错。失败且 “只读”不在(shared_dir_write_test.stderr | lower)):“dict” 对象“”没有属性“失败”


这些信息可以从可靠的事实中获得。完成此操作的Ansible代码:

- name: Determine shared-dir mount point
command: "/usr/bin/env stat -c '%m' {{ shared_dir_real_path }}"
register: shared_dir_mount_point
changed_when: False

- name: Determine the mount point's filesystem type and mount options
set_fact:
    "shared_dir_mount_{{ item }}": "{{ ansible_mounts | selectattr('mount', 'equalto', shared_dir_mount_point.stdout) | map(attribute = item) | join(',') }}"
with_items:
    - fstype
    - options

- name: Determine the access to the shared-data directory
set_fact:
    shared_dir_access_flags: "{{ ['ro', 'rw']  | intersect( shared_dir_mount_options.split(',') )}}"

- name: Verify Access mode sanity
assert:
    that: shared_dir_access_flags | length == 1
然后,为了确定安装是R/W还是R/O,我使用:

when: "'rw' in shared_dir_access_flags"

我以前使用的另一种更简洁但可能不太干净的方法是从/proc/self/mountinfo获取信息。比我希望的平台具体一点,但它只依赖于文档化的intreface

- name: Get Shared dir mount options
shell: "grep -F `stat -c '%m' {{ shared_dir_path }}` /proc/self/mountinfo | cut -d' ' -f 6"
register: shared_dir_mount_options
changed_when: False
然后,确定挂载是R/W还是R/O I的表达式将变得有点麻烦:

when: "'rw' in shared_dir_mount_options.stdout.split(',')"


这些信息可以从可靠的事实中获得。完成此操作的Ansible代码:

- name: Determine shared-dir mount point
command: "/usr/bin/env stat -c '%m' {{ shared_dir_real_path }}"
register: shared_dir_mount_point
changed_when: False

- name: Determine the mount point's filesystem type and mount options
set_fact:
    "shared_dir_mount_{{ item }}": "{{ ansible_mounts | selectattr('mount', 'equalto', shared_dir_mount_point.stdout) | map(attribute = item) | join(',') }}"
with_items:
    - fstype
    - options

- name: Determine the access to the shared-data directory
set_fact:
    shared_dir_access_flags: "{{ ['ro', 'rw']  | intersect( shared_dir_mount_options.split(',') )}}"

- name: Verify Access mode sanity
assert:
    that: shared_dir_access_flags | length == 1
然后,为了确定安装是R/W还是R/O,我使用:

when: "'rw' in shared_dir_access_flags"

我以前使用的另一种更简洁但可能不太干净的方法是从/proc/self/mountinfo获取信息。比我希望的平台具体一点,但它只依赖于文档化的intreface

- name: Get Shared dir mount options
shell: "grep -F `stat -c '%m' {{ shared_dir_path }}` /proc/self/mountinfo | cut -d' ' -f 6"
register: shared_dir_mount_options
changed_when: False
然后,确定挂载是R/W还是R/O I的表达式将变得有点麻烦:

when: "'rw' in shared_dir_mount_options.stdout.split(',')"


您可以收集可靠的事实,每个装载都有装载选项:

ansible localhost -m setup -a "filter=ansible_mounts"
样本输出:

[root@ansible ansible]# ansible localhost -m setup -a "filter=ansible_mounts"
localhost | SUCCESS => {
    "ansible_facts": {
        "ansible_mounts": [
            {
                "block_available": 3007928, 
                "block_size": 4096, 
                "block_total": 3929600, 
                "block_used": 921672, 
                "device": "/dev/mapper/fedora-root", 
                "fstype": "xfs", 
                "inode_available": 7787042, 
                "inode_total": 7864320, 
                "inode_used": 77278, 
                "mount": "/", 
                "options": "rw,relatime,attr2,inode64,noquota", 
                "size_available": 12320473088, 
                "size_total": 16095641600, 
                "uuid": "5faf23bb-281b-41d9-bd20-f8da6463eba0"
            }, 
            {
                "block_available": 185772, 
                "block_size": 4096, 
                "block_total": 249830, 
                "block_used": 64058, 
                "device": "/dev/sda1", 
                "fstype": "ext4", 
                "inode_available": 65179, 
                "inode_total": 65536, 
                "inode_used": 357, 
                "mount": "/boot", 
                "options": "rw,relatime,data=ordered", 
                "size_available": 760922112, 
                "size_total": 1023303680, 
                "uuid": "866845e7-6c62-41c9-bbd2-87b463326601"
            }
        ]
    }, 
    "changed": false
}
[root@ansible ansible]# ansible localhost -m setup -a "filter=ansible_mounts"

您可以收集可靠的事实,每个装载都有装载选项:

ansible localhost -m setup -a "filter=ansible_mounts"
样本输出:

[root@ansible ansible]# ansible localhost -m setup -a "filter=ansible_mounts"
localhost | SUCCESS => {
    "ansible_facts": {
        "ansible_mounts": [
            {
                "block_available": 3007928, 
                "block_size": 4096, 
                "block_total": 3929600, 
                "block_used": 921672, 
                "device": "/dev/mapper/fedora-root", 
                "fstype": "xfs", 
                "inode_available": 7787042, 
                "inode_total": 7864320, 
                "inode_used": 77278, 
                "mount": "/", 
                "options": "rw,relatime,attr2,inode64,noquota", 
                "size_available": 12320473088, 
                "size_total": 16095641600, 
                "uuid": "5faf23bb-281b-41d9-bd20-f8da6463eba0"
            }, 
            {
                "block_available": 185772, 
                "block_size": 4096, 
                "block_total": 249830, 
                "block_used": 64058, 
                "device": "/dev/sda1", 
                "fstype": "ext4", 
                "inode_available": 65179, 
                "inode_total": 65536, 
                "inode_used": 357, 
                "mount": "/boot", 
                "options": "rw,relatime,data=ordered", 
                "size_available": 760922112, 
                "size_total": 1023303680, 
                "uuid": "866845e7-6c62-41c9-bbd2-87b463326601"
            }
        ]
    }, 
    "changed": false
}
[root@ansible ansible]# ansible localhost -m setup -a "filter=ansible_mounts"

重要提示来自这里:重要提示来自这里:谢谢,我在这里也建议了这个答案:谢谢,我最终修改了我的代码,所以现在它更接近你的方法,并相应地修改了我的答案。谢谢,我在这里也建议了这个答案:谢谢,我最终修改了我的代码,所以现在它更接近你的方法,并相应地修改了我的答案。