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
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.
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
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
}}
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 }}
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/
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/*"
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
Alors que Ansible discute encore pour mettre en œuvre 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 }}"
Notez cependant qu'avec Synchroniser, vous devriez quand même pouvoir synchroniser vos fichiers (avec supprimer) correctement.
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
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é.
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
- 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
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
Ceci est mon exemple.
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
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
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*