Der folgende Code löscht nur die erste Datei, die er im Webverzeichnis erhält. Ich möchte alle Dateien und Ordner im Webverzeichnis entfernen und das Webverzeichnis beibehalten. Wie kann ich das machen?
- name: remove web dir contents
file: path='/home/mydata/web/{{ item }}' state=absent
with_fileglob:
- /home/mydata/web/*
Hinweis: Ich habe versucht rm -rf
, Befehl und Shell zu verwenden, aber sie funktionieren nicht. Vielleicht benutze ich sie falsch.
Jede Hilfe in die richtige Richtung wird geschätzt.
Ich benutze ansible 2.1.0.0
Antworten:
Der folgende Code löscht den gesamten Inhalt von
artifact_path
Hinweis : Dadurch wird auch das Verzeichnis gelöscht.
quelle
rm -rf /
when: artifact_path is defined and artifact_path != ""
Shell-Modul verwenden (auch idempotent ):
Sauberste Lösung, wenn Sie sich nicht um das Erstellungsdatum und den Eigentümer / die Berechtigungen kümmern:
quelle
shell
in fürcommand
und es funktioniertEntfernen Sie das Verzeichnis (im Grunde eine Kopie von https://stackoverflow.com/a/38201611/1695680 ). Ansible führt diesen Vorgang
rmtree
unter der Haube aus.Wenn Sie nicht den Luxus haben, das gesamte Verzeichnis zu entfernen und neu zu erstellen, können Sie es nach Dateien (und Verzeichnissen) durchsuchen und nacheinander löschen. Welches wird eine Weile dauern. Sie möchten wahrscheinlich sicherstellen, dass Sie
[ssh_connection]\npipelining = True
in Ihrer ansible.cfg auf haben.quelle
state=empty
Die rm-Lösung hat mir wirklich nicht gefallen, auch ansible gibt Ihnen Warnungen vor der Verwendung von rm. Hier erfahren Sie, wie Sie dies ohne die Notwendigkeit von rm und ohne ansible Warnungen tun können.
Quelle: http://www.mydailytutorials.com/ansible-delete-multiple-files-directories-ansible/
quelle
Versuchen Sie den folgenden Befehl, es sollte funktionieren
quelle
with_items: "{{ contents.stdout_lines }}"
ls
Ausgabe zu verwenden, um Dateinamen abzurufen, da Dateinamen mit Sonderzeichen wie Zeilenumbrüchen nicht korrekt gedruckt werden.Aus allen Kommentaren und Vorschlägen wurde eine insgesamt überarbeitete und ausfallsichere Implementierung erstellt:
quelle
register
fürplugin_dir_deleted
, oder?owner: dir_to_delete.stat.pw_name, group: dir_to_delete.stat.gr_name mode: dir_to_delete.stat.mode
aber es schlägt bei mir mit meiner aktuellen Ansible-Version fehl :(Mit File Glob wird es auch funktionieren. Der von Ihnen veröffentlichte Code enthält einen Syntaxfehler. Ich habe geändert und getestet, dass dies funktionieren sollte.
quelle
with_fileglob
funktioniert nur auf einem lokalen Computer, nicht auf einem Remote-Computer. ist es nicht wahr?Während Ansible noch über die Implementierung von https://github.com/ansible/ansible-modules-core/issues/902 debattiert
state = empty
Beachten Sie jedoch, dass Sie mit "Synchronisieren" Ihre Dateien (mit "Löschen") trotzdem ordnungsgemäß synchronisieren können sollten.
quelle
Das habe ich mir ausgedacht:
Zuerst erhalten wir eine Verzeichnisliste mit der
find
Einstellungfile_type
zuany
so würden wir nicht verpassen verschachtelte Verzeichnisse und Links,hidden
zuyes
, damit wir keine versteckten Dateien überspringenrecurse
aufyes
, da dies nicht nur unnötig ist, sondern auch die Ausführungszeit verlängern kann.Dann gehen wir diese Liste mit
file
Modul durch. Die Ausgabe ist etwas ausführlich undloop_control.label
hilft uns daher bei der Begrenzung der Ausgabe (ich habe diesen Rat gefunden hier ).Aber ich fand die vorherige Lösung etwas langsam, da sie den Inhalt durchläuft, also ging ich mit:
stat
Das hat mir gereicht, aber Sie können auch hinzufügen
attributes
, wenn Sie wollen.quelle
Es ist ein Problem offenDiesbezüglich .
Im Moment funktioniert die Lösung für mich: Erstellen Sie lokal einen leeren Ordner und synchronisieren Sie ihn mit dem Remote-Ordner.
Hier ist ein Beispiel für ein Spielbuch:
quelle
Ich habe ein benutzerdefiniertes ansible-Modul zum Bereinigen von Dateien geschrieben, das auf mehreren Filtern wie Alter, Zeitstempel, Glob-Mustern usw. basiert.
Es ist auch kompatibel mit ansible älteren Versionen. Es kann hier gefunden werden .
Hier ist ein Beispiel:
quelle
Ich möchte sicherstellen, dass der Befehl find nur alles im Verzeichnis löscht und das Verzeichnis intakt lässt, da das Verzeichnis in meinem Fall ein Dateisystem ist. Das System generiert beim Versuch, ein Dateisystem zu löschen, einen Fehler, aber das ist keine gute Option. Ich verwende die Shell-Option, da dies die einzige funktionierende Option ist, die ich bisher für diese Frage gefunden habe.
Was ich getan habe:
Bearbeiten Sie die Hosts-Datei, um einige Variablen einzugeben:
Und erstelle ein Spielbuch:
Dadurch werden alle Dateien und Verzeichnisse im Variablenverzeichnis / Dateisystem COGNOS_HOME gelöscht. Die Option "-mindepth 1" stellt sicher, dass das aktuelle Verzeichnis nicht berührt wird.
quelle
Nur eine kleine sauberere Copy & Paste-Vorlage von ThorSummoners Antwort, wenn Sie Ansible> = 2.3 verwenden (Unterscheidung zwischen Dateien und Verzeichnissen nicht mehr erforderlich.)
quelle
Angenommen, Sie sind immer unter Linux, versuchen Sie es mit dem
find
cmd.Dies sollte Dateien / Ordner / versteckt unter löschen
/home/mydata/web
quelle
quelle
Das ist mein Beispiel.
Starten Sie rsyslog
quelle
Unten hat für mich gearbeitet,
quelle