代码之家  ›  专栏  ›  技术社区  ›  Isac Casapu

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

  •  0
  • Isac Casapu  · 技术社区  · 7 年前

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

    - 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建议我使用 文件 具有的模块 状态=触摸 但是,下面的代码失败了,因为似乎没有办法检查 文件

      - 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)"
    

    条件检查“shared\u dir\u write\u test”。失败且为“只读” not in(shared\u dir\u write\u test.stderr | lower)失败。错误是: 计算条件时出错(shared\u dir\u write\u test.failed and “只读”不在(shared\u dir\u write\u test.stderr | lower)):“dict” 对象“”没有属性“”失败“”

    2 回复  |  直到 7 年前
        1
  •  2
  •   ilias-sp    7 年前

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

    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"
    
        2
  •  1
  •   Isac Casapu    7 年前

    这些信息可以从可靠的事实中获得。完成此操作的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 I,请使用:

    when: "'rw' in shared_dir_access_flags"
    

    when: "'ro' 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(',')"
    

    when: "'ro' in shared_dir_mount_options.stdout.split(',')"
    
    推荐文章