2016-01-11 15 views
5

Ich muss überprüfen, ob ein Verzeichnis ein Mount-Punkt ist, bevor Sie einige andere Aufgaben ausführen.Prüfen, ob das Verzeichnis ein Mount-Punkt ist?

Ich habe mich in der Dokumentation umgeschaut und es scheint nur, dass Sie mount Punkte erstellen/zerstören können, aber nicht nur prüfen, ob eine vorhanden ist. Von dem Link unten.

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

Ich frage mich, ob es eine Möglichkeit, es mit ansible besteht zu prüfen ist, oder es wird eine andere Sprache aus ansible genannt sein müssen.

Antwort

11

Ich habe mit mount und stat Modul versucht. Beide haben Ihre Anforderungen nicht erfüllt.

Ich habe es geschafft, nur mit einem OS-Befehl zu arbeiten. Ich habe auf Redhat-, Debian- und SLES-Familien getestet.

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 

Das Problem ist, mountpoint Befehl Stderr erzeugt, wenn der Pfad nicht ein Mount-Punkt ist, so dass Sie ignore_errors verwenden, ist Hexe keine gute Lösung.

EDIT 1: Ist durch @udondan erwähnt, failed_when ist ein besserer Ansatz dann ignore_errors, da es nicht Ausgabefehler der Fall ist.

Es kann sein, was Sie wollen, wenn Sie das Playbook stoppen müssen, wenn der Pfad kein Mount-Punkt ist.

Ich hoffe, jemand findet eine bessere Lösung als diese.

HINWEIS: Es gibt einige Plattformen, die nicht mountpoint Befehl hat, soweit ich weiß, Darwin (Mac OSX) und SunOS (Oracle Solaris), wenn Sie diese brauchen auf diesen Systemen zu arbeiten, werden Sie muss eine andere Problemumgehung finden.

+0

Ich glaube, um einen Mountpoint zu erstellen, muss das Ziel tatsächlich existieren. Ein vorhandener Pfad bedeutet jedoch nicht, dass er bereitgestellt wird. – udondan

+0

Sie haben Recht @udondan, ich habe meine Antwort geändert. –

+0

Anstatt 'ignore_errors: true' könnten Sie' failed_when: false' verwenden.Es ist ein bisschen weniger hässlich, weil es den Fehler in der Ausgabe nicht zeigen würde. Auf der anderen Seite würde es _alle_ Fehler überspringen. Ich weiß nicht, ob der Befehl 'Mountpoint' auf manchen Systemen nicht existiert. Das wäre etwas, an dem du versagen würdest. :) Aber wenn du so willst, kannst du mit der Bedingung 'failed_when' fiedeln. – udondan

2

Nach einer Weile des Versuchens kam ich auf diese Idee.

vars: 
- myvolume: /backup 

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

Ich bin nicht sicher, wie dies für alle Systeme gilt und/oder wenn ansible_mounts enthält alle Bereitstellungspunkte des OS oder nur die mit ansible erzeugt wird.

+1

Ich habe diese Tatsache getestet, es zeigt alle Mount-Punkte. Arbeitete an SLES, RedHat und Ubuntu/Debian. Unter SunOS (Solaris 11,10), Darwin (MacOSX El Capitan) und HPUX war die Variable nicht vorhanden. Ich bevorzuge Lösungen, die keine Module wie 'shell' oder' command' erfordern, weil Sie nicht 'dry run mode' verwenden können. –

1

können Sie verwenden ansible „Befehl“ des Moduls „stdout“ den Mount-Status eines bestimmten Verzeichnisses zu bestimmen, wird Beispielcode hier eingefügt:

- 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" 
+1

Sie sollten detailliertere Antwort schreiben. Zuerst müssen Sie die Quelle des geposteten Textes erwähnen, da Sie sie im Grunde nur aus der Dokumentation kopiert haben. Zweitens kann dieser Code vor Ort von Fragesteller angezeigt werden, so glaube ich, dass er es gelesen hat. Wenn ja, hat er diesen Text wahrscheinlich nicht verstanden. Am Ende denke ich, dass er einen Kommentar von dir schätzen wird. –

1

ähnliche Schwierigkeiten zu haben, aber so etwas wie dies versuchen -

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

Nun, wenn ich nur herausfinden, wie zuverlässig die Größe des Mount-Punkt zu bekommen, lol

B TW, lohnt sich, die Standard-Fakten zu betrachten, wie {{ ansible_mounts }}, obwohl mein/dev/shm dort nicht zeigt - weiß noch nicht warum. Caveat scriptor, ymmv.