web-dev-qa-db-ja.com

ディレクトリがマウントポイントかどうかを確認しますか?

他のタスクを実行する前に、ディレクトリがマウントポイントであるかどうかを確認する必要があります。

私はドキュメントを見回してきましたが、マウントポイントを作成/破棄できるのは、マウントポイントが存在するかどうかを確認するだけではないようです。以下のリンクから。

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

それがansibleで存在することを確認する方法があるのか​​、それともansibleから呼び出される他の言語である必要があるのか​​疑問に思います。

7
nazerb

mountモジュールとstatモジュールの両方を試してみました。どちらも要件を満たしていませんでした。

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を使用する必要があることです。これは、適切な解決策ではありません。

EDIT 1:@ udondanによって言及されていますが、エラーを出力しないため、failed_whenignore_errorsよりも優れたアプローチです。

パスがマウントポイントでない場合にプレイブックを停止する必要がある場合は、これが必要な場合があります。

誰かがこれよりも良い解決策を見つけてくれることを願っています。

[〜#〜] note [〜#〜]:Darwin(Mac OSX)とSunOS(Oracle)を知っている限り、mountpointコマンドがないプラットフォームがいくつかあります。 Solaris)、これらのシステムでこれを機能させる必要がある場合は、別の回避策を見つける必要があります。

12
Bernardo Vale

しばらく試してみて、これを思いついた。

vars:
- myvolume: /backup

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

これがすべてのシステムにどのように適用されるか、および/またはansible_mountsには、OSのすべてのマウントポイント、またはansibleで作成されたマウントポイントのみが含まれます。

4
nazerb

同様の問題がありますが、次のようなことを試してください-

- 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を確実に取得する方法がわかれば、笑

ところで、{{ ansible_mounts }}のようなデフォルトの事実を見る価値はありますが、私の/ dev/shmはそこに表示されていません-理由はまだわかりません。 警告スクリプター、ymmv。

2
Paul Hodges

Ansibleの「コマンド」モジュールの「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"
2
user2975169

多少複雑ですが、追加のコマンドを実行せずに、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:
0
EM0