web-dev-qa-db-fra.com

Ansible: Comment supprimer des fichiers et des dossiers dans un répertoire?

Le code ci-dessous ne supprime que le premier fichier qu'il obtient dans le répertoire Web. Je souhaite supprimer tous les fichiers et dossiers du répertoire Web et conserver le répertoire Web. Comment puis je faire ça? 

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

Remarque: J'ai essayé rm -rf à l'aide de la commande et du shell, mais ils ne fonctionnent pas. Peut-être que je les utilise mal.

Toute aide dans la bonne direction sera appréciée.

J'utilise ansible 2.1.0.0

108
Abbas

Le code ci-dessous supprimera tout le contenu de artifact_path

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

Remarque: cela supprimera également le répertoire.

116
Mohan Kumar P

Utilisation du module Shell:

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

La solution la plus propre si vous ne vous souciez pas de la date de création:

- file: path=/home/mydata/web state=absent
- file: path=/home/mydata/web state=directory
54
helloV

Supprimez le répertoire (une copie de https://stackoverflow.com/a/38201611/1695680 ), Ansible effectue cette opération avec rmtree sous le capot.

- 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

Si vous n'avez pas le luxe de supprimer tout le répertoire et de le recréer, vous pouvez le rechercher à la recherche de fichiers (et de répertoires) et les supprimer un à un. Ce qui prendra un moment. Vous voulez probablement vous assurer que vous avez [ssh_connection]\npipelining = True dans votre 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
      }}
32
ThorSummoner

essayez la commande ci-dessous, cela devrait marcher

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

- file: path=/some/dir/{{ item }} state=absent
  with_items: {{ contents.stdout_lines }}
16
Ganesan Srinivasan

Je n’ai vraiment pas aimé la solution rm, ansible vous avertit également de l’utilisation de rm. Alors, voici comment le faire sans avoir besoin d’être averti et sans avertissement. 

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

source: http://www.mydailytutorials.com/ansible-delete-multiple-files-directories-ansible/

10
Cris

En utilisant le fichier glob aussi cela fonctionnera. Il y a une erreur de syntaxe dans le code que vous avez posté. J'ai modifié et testé cela devrait fonctionner.

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

Création d'une mise en œuvre globale réorganisée et sans faille à partir de tous les commentaires et suggestions:

# 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

Alors que Ansible discute encore pour mettre en œuvre 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 }}"

Notez cependant qu'avec Synchroniser, vous devriez quand même pouvoir synchroniser vos fichiers (avec supprimer) correctement.

2
Marcin

Il y a un problème en suspens à ce sujet.

Pour le moment, la solution fonctionne pour moi: créez un dossier vide localement et synchronisez-le avec le dossier distant.

Voici un exemple de livre de lecture:

- 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

Je veux m'assurer que la commande find ne supprime que tout ce qui se trouve dans le répertoire et le laisse intact, car dans mon cas, le répertoire est un système de fichiers. Le système générera une erreur lors de la tentative de suppression d'un système de fichiers, mais ce n'est pas une option intéressante. J'utilise l'option Shell parce que c'est la seule option de travail que j'ai trouvée jusqu'à présent pour cette question.

Ce que j'ai fait:

Editez le fichier hosts pour mettre quelques variables:

[all:vars]
COGNOS_HOME=/tmp/cognos
find=/bin/find

Et créez un playbook:

- hosts: all
  tasks:
  - name: Ansible remove files
    Shell: "{{ find }} {{ COGNOS_HOME }} -xdev -mindepth 1 -delete"

Cela supprimera tous les fichiers et répertoires du répertoire/système de fichiers variable COGNOS_HOME. L'option "-mindepth 1" permet de s'assurer que le répertoire en cours ne sera pas touché.

1
Tjerk Maij

Juste un petit modèle de copier/coller nettoyant de la réponse de ThorSummoners, si vous utilisez Ansible> = 2.3 (la distinction entre les fichiers et les répertoires n’est plus nécessaire).

- 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

En supposant que vous soyez toujours sous Linux, essayez la find cmd.

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

Cela devrait effacer les fichiers/dossiers/cachés sous /home/mydata/web

0
Sherzod Odinaev

Ceci est mon exemple.

  1. Installer repo
  2. Installer le package rsyslog
  3. arrêtez rsyslog
  4. supprimer tous les fichiers dans/var/log/rsyslog /
  5. démarrer 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

Suivez ci-dessous:

- 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

J'ai écrit un module personnalisé ansible pour nettoyer les fichiers en fonction de plusieurs filtres tels que l'âge, l'horodatage, les modèles globaux, etc.

Il est également compatible avec les anciennes versions de Ansible. On peut le trouver ici .

Voici un exemple:

- cleanup_files:
  path_pattern: /tmp/*.log
  state: absent
  excludes:
    - foo*
    - bar*
0
Rahul