web-dev-qa-db-de.com

Ansible: Wie lösche ich Dateien und Ordner in einem Verzeichnis?

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

108
Abbas

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.

116
Mohan Kumar P

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
54
helloV

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
      }}
32
ThorSummoner

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 }}
16

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/

10
Cris

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/*"
5
Deepali Mittal

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
3
Markus

Während Ansible über die Implementierung von state = emptyhttps://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).

2
Marcin

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
2
w1100n

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.

1
Tjerk Maij

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
0
Enno Gröper
  - 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
0
lanni654321

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.

0
Sherzod Odinaev

Das ist mein Beispiel.

  1. Installieren Sie repo
  2. Installieren Sie das rsyslog-Paket
  3. beenden Sie rsyslog
  4. lösche alle Dateien in/var/log/rsyslog /
  5. 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
    
0
Satish

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
0
felipealves.gnu

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*
0
Rahul