2016-07-05 34 views
67

Il seguente codice cancella solo il primo file che ottiene nella cartella web. Voglio rimuovere tutti i file e le cartelle all'interno della directory web e mantenere la directory web. Come lo posso fare?Ansible: come eliminare file e cartelle all'interno di una directory?

- name: remove web dir contents 
    file: path='/home/mydata/web/{{ item }}' state=absent 
    with_fileglob: 
     - /home/mydata/web/* 

Nota: ho provato rm -rf utilizzando il comando e la shell, ma non funzionano. Forse li sto usando male.

Qualsiasi aiuto nella giusta direzione sarà apprezzato.

Sto usando ansible 2.1.0.0

+0

Sembra come un insetto. – ceving

risposta

61

Sotto codice cancellare l'intero contenuto del artifact_path

- name: Clean artifact path 
    file: 
    state: absent 
    path: "{{ artifact_path }}/" 

Nota: questo cancellerà la directory troppo.

+0

Puoi per favore fornire il codice con le virgolette mancanti e dove dovrebbero essere, continua a generare errori quando ho provato. – Abbas

+1

le citazioni non sono obbligatorie. Questo è solo il mio codice di lavoro. artifact_path è come/app/my_app/work/ –

+0

Che errore si sta ottenendo? Si prega di postarlo. –

37

Utilizzando il modulo di shell:

- shell: /bin/rm -rf /home/mydata/web/* 

soluzione più pulita se non si cura di data di creazione:

- file: path=/home/mydata/web state=absent 
- file: path=/home/mydata/web state=directory 
+2

Funziona ma non rimuove i file che iniziano con. come .htaccess – Abbas

+0

Shell ha funzionato anche per me. Esatto stesso compito ma scambiato 'shell' in per' comando' e funziona con – SomethingOn

+0

I caratteri jolly non funzionano con il comando in quanto richiedono una shell per l'espansione – JamesP

12

provare il seguente comando, dovrebbe funzionare

- shell: ls -1 /some/dir 
    register: contents 

- file: path=/some/dir/{{ item }} state=absent 
    with_items: {{ contents.stdout_lines }} 
+1

che ti è sfuggito per uscire correttamente l'ultima riga con {{,}} per ottenere 'with_items: "{{contents.stdout_lines}}" ' –

+0

È pericoloso utilizzare l'output' ls' 'per ottenere nomi di file perché non stampa correttamente i nomi di file con caratteri speciali come newline. – bfontaine

1

Utilizzando file glob inoltre funzionerà. C'è qualche errore di sintassi nel codice che hai postato. Ho modificato e testato questo dovrebbe funzionare.

- name: remove web dir contents 
    file: 
    path: "{{ item }}" 
    state: absent 
    with_fileglob: 
    - "/home/mydata/web/*" 
+6

'with_fileglob' funziona solo su una macchina locale, non remota; non è vero? –

+0

True .. with_fileglob è solo per locale –

+0

Inoltre, questo non elimina le directory, solo i file vengono cancellati. – vikas027

16

Rimuovere la directory (sostanzialmente una copia di https://stackoverflow.com/a/38201611/1695680), Ansible fa questa operazione con rmtree sotto il cofano.

- 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 

Se non avete il lusso di rimuovere l'intera directory e ricrearla, è possibile eseguire la scansione per i file, (e le directory), ed eliminare uno ad uno. Ci vorrà un po 'di tempo. Probabilmente vorrai assicurarti di avere [ssh_connection]\npipelining = True su ansible.cfg.

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

Dando per scontato che sempre in Linux, provare il find cmd.

- name: Clean everything inside {{ item }} 
    shell: test -d {{ item }} && find {{ item }} -path '{{ item }}/*' -prune -exec rm -rf {} \; 
    with_items: [/home/mydata/web] 

Questo dovrebbe eliminare i file/cartelle/nascoste sotto /home/mydata/web

-4

seguito ha lavorato per me,

- name: Ansible delete html directory 
    file: 
    path: /var/www/html 
    state: directory 
1

Mentre Ansible è ancora discutendo per implementare 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 }}" 

Nota però, con la sincronizzazione dovresti essere in grado di sincronizzare correttamente i tuoi file (con eliminazione) in ogni caso.

1

un problema per le cartelle vuote qui, https://github.com/ansible/ansible/issues/18910

e per ora, questa soluzione funziona per me.

creare una cartella vuota

makedir /tmp/empry 

quindi aggiungere le righe seguenti nel playbook ansible

- name: Empty remote directory 
synchronize: 
    src: /tmp/empry/ 
    dest: /home/mydata/web/ 
    delete: yes 
    recursive: yes 
Problemi correlati