2016-05-19 30 views
7

Ich benutze Ansible, um Protokolle in das Backup-Verzeichnis zu verschieben (mit shell Modul, mv Befehl).Wie wird Ansible-Task ausgeführt, wenn das angegebene Verzeichnis nicht leer ist?

mv Der Befehl schlägt fehl, wenn keine Dateien zu verschieben sind. Standardmäßig wird die gesamte Ansible-Wiedergabe fehlgeschlagen. ich mit Spiel fortgesetzt werden kann, selbst wenn Aufgabe (ignore_errors: yes)

Einzahler diese Lösung, die ich bin nicht zufrieden, weil es

Fehlermeldung erzeugt

TASK [Verschieben von Dateien auf Backup-Verzeichnis] ​​ **** ************************************** fatal: [xx.xx.xx.xx]: GESCHEITERT! ? = ... Keine solche Datei oder das Verzeichnis“, "stdout": "", "stdout_lines": [], "Warnungen": []} ... ignorieren

Wie zu überprüfen, ob Verzeichnis leer in ansible, und wenn sie leer jus Aufgabe überspringen?

Antwort

9

Sie verwenden Modul in ansible 2.0 zu finden Dateien mit .log Erweiterung im Verzeichnis führen Sie dann bewegen, wenn Dateien gefunden wird

- find: paths=DIRECTORY file_type=directory patterns="*.log" 
    register: dir_files 

- shell: mv *.log /tmp 
    when: dir_files.matched|int != 0 
+0

groß, dank zu nutzen! Eine Frage: Ist es eine gute Idee, "changed_when: false" zu "find" hinzuzufügen? Dieser Befehl wird immer ausgeführt und ändert nichts. Ich füge normalerweise changed_when: false zu solchen reinen Tests hinzu, ohne Nebenwirkungen. Auf diese Weise werden die Handler nicht aufgerufen und die Wiedergabe-Wiederholung sieht besser aus (Ich habe = 0 geändert, es sei denn, etwas wird wirklich geändert). –

1

Es gibt akzeptierte Antwort finden können, Verwendet find Modul

Eine weitere Option (weniger lesbar und ausführlicher) stammt Linux

Commands- test Ergebnis ls Befehl
- name: "backup logs" 
    shell: test "$(ls /var/logs/)" 
    register: logsPresent 
    changed_when: false 

- name: "move files to backup directory" 
    when: "logsPresent.rc != 0" 
    shell: "mv /var/logs/ /backup/logs"