检查目录是否是挂载点?

时间:2016-01-11 11:56:55

标签: ansible ansible-playbook mount

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

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

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

我想知道是否有任何方法可以检查它是否存在于ansible中,或者它是否必须是来自ansible的其他语言。

5 个答案:

答案 0 :(得分: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

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

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

如果路径不是挂载点,则需要停止播放列表,这可能是您想要的。

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

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

答案 1 :(得分:3)

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

vars:
- myvolume: /backup

tasks:
- debug: msg="The dir is a mount point"
  with_items: ansible_mounts
  when: item.mount == myvolume

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

答案 2 :(得分:2)

您可以使用Ansible“command”模块的“stdout”来确定给定目录的挂载状态,示例代码粘贴在此处:

- name: "check mount point {{ mount_dir }}"
  command: mountpoint {{ mount_dir }}
  register: mount_stat
  failed_when: False
  changed_when: False

- name: "debug"
  when: mount_stat.stdout == "{{ mount_dir }} is a mountpoint"
  debug:
    msg: "{{ mount_dir }} is a mountpoint"

- name: "debug"
  when: mount_stat.stdout == "{{ mount_dir }} is not a mountpoint"
  debug:
    msg: "{{ mount_dir }} is not a mountpoint"

答案 3 :(得分:2)

有类似的困难,但尝试这样的事情 -

- name: testing for required mount points
  fail:
    msg: "{{ item }} must be a mount point"
  when: not item|is_mount  
  with_items: 
    - /path/to/test

现在,如果我能弄清楚如何可靠地获得挂载点的 size ,那么大声笑

BTW,值得查看默认事实,例如{{ ansible_mounts }},虽然我的/ dev / shm没有显示 - 但不知道为什么。 警告脚本,ymmv。

答案 4 :(得分:0)

尽管有些麻烦,您可以使用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

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

请注意,Ansible事实不会自动更新,因此,如果在播放过程中挂载或卸载目录,除非重新运行设置模块进行更新,否则结果将是过时的:

- name: Gather facts again to update mount points
  setup: