220 votes

Ansible : Comment supprimer des fichiers et des dossiers à l'intérieur d'un répertoire ?

Le code ci-dessous ne supprime que le premier fichier qu'il trouve dans le répertoire web. Je veux supprimer tous les fichiers et dossiers à l'intérieur du répertoire web et conserver le répertoire web. Comment puis-je le faire ?

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

Note : J'ai essayé rm -rf en utilisant command et 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.

0 votes

On dirait un bug.

191voto

Mohan Kumar P Points 1292

Le code ci-dessous supprimera tout le contenu de artifact_path

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

Note : cela supprimera également le répertoire.

0 votes

Pouvez-vous s'il vous plaît fournir le code avec les guillemets manquants et où ils devraient être, continue à jeter des erreurs quand j'ai essayé.

3 votes

Les devis ne sont pas nécessaires. Ceci est mon code de travail seulement. artefact_path est comme /app/my_app/work/

0 votes

@Abbas Vous devriez utiliser des arguments de type YAML au lieu du format clé=valeur d'Ansible. Comme ceci : file: {state: absent, path: "{{ artifact_path }}"} . (Vous pouvez mettre les arguments sur plusieurs lignes, mais je ne peux pas le montrer dans un commentaire).

98voto

ThorSummoner Points 396

Supprimez le répertoire (essentiellement 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 y rechercher des fichiers (et des répertoires) et les supprimer un par un. Ce qui prendra un certain temps. Vous voulez probablement vous assurer que vous avez [ssh_connection]\npipelining = True dans votre ansible.cfg sur.

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

16 votes

La première tâche est la solution la plus élégante que j'ai vue. Notez les commentaires par ailleurs qu'il y a une demande de fonctionnalité de longue date pour ajouter state=empty

92voto

helloV Points 28122

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

9 votes

Cela fonctionne mais n'a pas supprimé les fichiers commençant par . comme .htaccess.

0 votes

Shell a également fonctionné pour moi. Exactement la même tâche mais en échangeant shell pour command et ça marche

8 votes

Les caractères génériques ne fonctionnent pas avec les commandes car ils nécessitent un shell pour l'expansion.

53voto

Cris Points 166

Je n'ai pas vraiment aimé la solution rm, et ansible vous met en garde contre l'utilisation de rm. Voici donc comment le faire sans avoir besoin de rm et sans les avertissements d'ansible.

- 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/

3 votes

Pourtant la meilleure solution à la question !

2 votes

Cela supprimera le dossier item.path également

0 votes

Au moins dans la version actuelle, il ne supprimera pas item.path dossier.

18voto

essayez la commande ci-dessous, cela devrait fonctionner

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

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

4 votes

Tu as oublié d'échapper correctement la dernière ligne avec {{, }} pour obtenir with_items: "{{ contents.stdout_lines }}"

2 votes

C'est dangereux d'utiliser ls pour obtenir les noms de fichiers car il n'imprime pas correctement les noms de fichiers avec des caractères spéciaux tels que les nouvelles lignes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X