Der folgende Code löscht nur die erste Datei, die im Webverzeichnis abgelegt wird. 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 rm -rf
mit command und Shell versucht, 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
Der folgende Code löscht den gesamten Inhalt von artifact_path
- name: Clean artifact path
file:
state: absent
path: "{{ artifact_path }}/"
Hinweis: Dadurch wird auch das Verzeichnis gelöscht.
Verwenden des Shell-Moduls:
- Shell: /bin/rm -rf /home/mydata/web/*
Sauberste Lösung, wenn das Erstellungsdatum nicht wichtig ist:
- file: path=/home/mydata/web state=absent
- file: path=/home/mydata/web state=directory
Entfernen Sie das Verzeichnis (im Grunde eine Kopie von https://stackoverflow.com/a/38201611/1695680 ). Ansible führt diesen Vorgang mit rmtree
unter der Haube aus.
- name: remove files and directories
file:
state: "{{ item }}"
path: "/srv/deleteme/"
owner: 1000 # set your owner, group, and mode accordingly
group: 1000
mode: '0777'
with_items:
- absent
- directory
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. Was wird eine Weile dauern. Sie möchten wahrscheinlich sicherstellen, dass Sie [ssh_connection]\npipelining = True
in Ihrer ansible.cfg haben.
- block:
- name: 'collect files'
find:
paths: "/srv/deleteme/"
hidden: True
recurse: True
# file_type: any # Added in ansible 2.3
register: collected_files
- name: 'collect directories'
find:
paths: "/srv/deleteme/"
hidden: True
recurse: True
file_type: directory
register: collected_directories
- name: remove collected files and directories
file:
path: "{{ item.path }}"
state: absent
with_items: >
{{
collected_files.files
+ collected_directories.files
}}
versuchen Sie den folgenden Befehl, es sollte funktionieren
- Shell: ls -1 /some/dir
register: contents
- file: path=/some/dir/{{ item }} state=absent
with_items: {{ contents.stdout_lines }}
Ich habe die Lösung von rm wirklich nicht gemocht, und ansible gibt Ihnen Warnungen vor der Verwendung von rm. Hier ist, wie es ohne rm und ohne ansehnliche Warnungen zu tun ist.
- hosts: all
tasks:
- name: Ansible delete file glob
find:
paths: /etc/Ansible
patterns: "*.txt"
register: files_to_delete
- name: Ansible remove file glob
file:
path: "{{ item.path }}"
state: absent
with_items: "{{ files_to_delete.files }}"
quelle: http://www.mydailytutorials.com/ansible-delete-multiple-files-directories-ansible/
Mit Datei-Glob wird es auch funktionieren. Der Code, den Sie gepostet haben, enthält einen Syntaxfehler. Ich habe modifiziert und getestet, dass dies funktionieren sollte.
- name: remove web dir contents
file:
path: "{{ item }}"
state: absent
with_fileglob:
- "/home/mydata/web/*"
Erstellung einer überarbeiteten und ausfallsicheren Implementierung aus allen Kommentaren und Vorschlägen:
# collect stats about the dir
- name: check directory exists
stat:
path: '{{ directory_path }}'
register: dir_to_delete
# delete directory if condition is true
- name: purge {{directory_path}}
file:
state: absent
path: '{{ directory_path }}'
when: dir_to_delete.stat.exists and dir_to_delete.stat.isdir
# create directory if deleted (or if it didn't exist at all)
- name: create directory again
file:
state: directory
path: '{{ directory_path }}'
when: dir_to_delete is defined or dir_to_delete.stat.exist == False
Während Ansible über die Implementierung von state = empty
https://github.com/ansible/ansible-modules-core/issues/902
my_folder: "/home/mydata/web/"
empty_path: "/tmp/empty"
- name: "Create empty folder for wiping."
file:
path: "{{ empty_path }}"
state: directory
- name: "Wipe clean {{ my_folder }} with empty folder hack."
synchronize:
mode: Push
#note the backslash here
src: "{{ empty_path }}/"
dest: "{{ nl_code_path }}"
recursive: yes
delete: yes
delegate_to: "{{ inventory_hostname }}"
Beachten Sie jedoch, dass Sie mit synchronize in der Lage sein sollten, Ihre Dateien trotzdem zu synchronisieren (mit zu löschen).
Dazu gibt es ein Problem offen .
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-Spielbuch:
- name: "Empty directory"
hosts: *
tasks:
- name: "Create an empty directory (locally)"
local_action:
module: file
state: directory
path: "/tmp/empty"
- name: Empty remote directory
synchronize:
src: /tmp/empty/
dest: /home/mydata/web/
delete: yes
recursive: yes
Ich möchte sicherstellen, dass der Befehl find nur das gesamte Verzeichnis löscht und das Verzeichnis intakt lässt, da in meinem Fall das Verzeichnis ein Dateisystem ist. Das System generiert einen Fehler, wenn Sie versuchen, ein Dateisystem zu löschen. Dies ist jedoch keine Option von Nice. Ich verwende die Shell-Option, weil 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 einzufügen:
[all:vars]
COGNOS_HOME=/tmp/cognos
find=/bin/find
Und ein Spielbuch erstellen:
- hosts: all
tasks:
- name: Ansible remove files
Shell: "{{ find }} {{ COGNOS_HOME }} -xdev -mindepth 1 -delete"
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.
Nur eine kleine übersichtliche Copy & Paste-Vorlage von ThorSummoners beantwortet, wenn Sie Ansible> = 2.3 verwenden (Unterscheidung zwischen Dateien und Verzeichnissen nicht mehr erforderlich).
- name: Collect all fs items inside dir
find:
path: "{{ target_directory_path }}"
hidden: true
file_type: any
changed_when: false
register: collected_fsitems
- name: Remove all fs items inside dir
file:
path: "{{ item.path }}"
state: absent
with_items: "{{ collected_fsitems.files }}"
when: collected_fsitems.matched|int != 0
- name: delete old data and clean cache
file:
path: "{{ item[0] }}"
state: "{{ item[1] }}"
with_nested:
- [ "/data/server/{{ app_name }}/webapps/", "/data/server/{{ app_name }}/work/" ]
- [ "absent", "directory" ]
ignore_errors: yes
Wenn Sie sich immer unter Linux befinden, probieren Sie den Befehl find
aus.
- name: Clean everything inside {{ item }}
Shell: test -d {{ item }} && find {{ item }} -path '{{ item }}/*' -Prune -exec rm -rf {} \;
with_items: [/home/mydata/web]
Dadurch sollten Dateien/Ordner/unter /home/mydata/web
ausgeblendet werden.
Das ist mein Beispiel.
starten Sie rsyslog
- hosts: all
tasks:
- name: Install rsyslog-v8 yum repo
template:
src: files/rsyslog.repo
dest: /etc/yum.repos.d/rsyslog.repo
- name: Install rsyslog-v8 package
yum:
name: rsyslog
state: latest
- name: Stop rsyslog
systemd:
name: rsyslog
state: stopped
- name: cleann up /var/spool/rsyslog
Shell: /bin/rm -rf /var/spool/rsyslog/*
- name: Start rsyslog
systemd:
name: rsyslog
state: started
Folgen Sie unten:
- hosts: all
tasks:
- name: Empty remote directory
file:
path: /home/felipe/files
state: absent
become: yes
- name: Create
file:
path: /home/felipe/files
state: directory
owner: jboss
group: jboss
mode: u=rwx,g=rx,o=rx
become: yes
Ich habe ein benutzerdefiniertes Ansible-Modul geschrieben, um Dateien basierend auf mehreren Filtern wie Alter, Zeitstempel, Glob-Muster usw. zu bereinigen.
Es ist auch kompatibel mit älteren Versionen. Es kann gefunden werden hier .
Hier ist ein Beispiel:
- cleanup_files:
path_pattern: /tmp/*.log
state: absent
excludes:
- foo*
- bar*