检查目录是否是挂载点?

naz*_*erb 7 mount ansible ansible-playbook

在执行其他任务之前,我需要检查目录是否是挂载点.

我一直在查看文档,它似乎只能创建/销毁挂载点,而不仅仅是检查是否存在.从下面的链接.

http://docs.ansible.com/ansible/mount_module.html

我想知道是否有任何方法可以检查它是否与ansible存在,或者它是否必须是从ansible调用的其他语言.

Ber*_*ale 12

我试过两个mountstat模块.两者都不符合您的要求.

我设法只使用OS命令.我在Redhat,Debian和SLES家族上进行了测试.

vars:
    - myvolume: /backup

tasks:

   - command: mountpoint -q {{myvolume}}
     register: volume_stat
     failed_when: False
     changed_when: False

    - debug:
       msg: "This is a mountpoint!"
      when: volume_stat.rc == 0
Run Code Online (Sandbox Code Playgroud)

问题是,mountpoint如果路径不是挂载点而命令生成stderr,那么你必须使用ignore_errors,这不是一个好的解决方案.

编辑1:@udondan提到,failed_when是一种更好的方法,ignore_errors因为它不输出错误.

如果您需要在路径不是挂载点时停止播放,则可能是您想要的.

我希望有人找到比这更好的解决方案.

注意:有些平台没有mountpoint命令,据我所知Darwin(Mac OSX)和SunOS(Oracle Solaris),如果您需要在这些系统上工作,您需要找到另一种解决方法.


naz*_*erb 5

经过一段时间的尝试,我想出了这个。

vars:
- myvolume: /backup

tasks:
- debug: msg="The dir is a mount point"
  with_items: ansible_mounts
  when: item.mount == myvolume
Run Code Online (Sandbox Code Playgroud)

我不确定这如何适用于所有系统和/或是否ansible_mounts包含操作系统的所有挂载点或仅包含使用 ansible 创建的挂载点。

  • 我已经测试过这个事实,它显示了所有安装点。曾在 SLES、RedHat 和 Ubuntu/Debian 上工作过。在 SunOS (Solaris 11,10)、Darwin (MacOSX El Capitan) 和 HPUX 上,该变量不存在。我更喜欢不需要“shell”或“c​​ommand”等模块的解决方案,因为您不能使用“试运行模式”。 (2认同)

EM0*_*EM0 5

您可以使用事实来检查这一点ansible_mounts,而无需运行额外的命令,尽管这有点令人费解。

- debug:
    msg: "{{ mount_point }} is mounted"
  when: ansible_mounts | selectattr('mount', 'equalto', mount_point) | list | length > 0

- debug:
    msg: "{{ mount_point }} is not mounted"
  when: ansible_mounts | selectattr('mount', 'equalto', mount_point) | list | length == 0
Run Code Online (Sandbox Code Playgroud)

其中mount_point是要检查的目录路径。

请注意,Ansible 事实不会自动更新,因此如果您在播放期间挂载或卸载目录,结果将过时,除非您通过重新运行安装模块来更新它们:

- name: Gather facts again to update mount points
  setup:
Run Code Online (Sandbox Code Playgroud)