create change ansible ansible-playbook delete-file delete-directory

change - ansible rmdir



Ansible: ¿Cómo eliminar archivos y carpetas dentro de un directorio? (17)

A continuación funcionó para mí

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

El siguiente código solo elimina el primer archivo que se encuentra dentro del directorio web. Quiero eliminar todos los archivos y carpetas dentro del directorio web y conservar el directorio web. ¿Cómo puedo hacer eso?

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

Nota: He intentado rm -rf usando command y shell, pero no funcionan. Quizás los estoy usando mal.

Cualquier ayuda en la dirección correcta será apreciada.

Estoy usando ansible 2.1.0.0


Creé una implementación general revisada y segura de todos los comentarios y sugerencias:

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


El siguiente código eliminará todo el contenido de artifact_path

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

Nota : esto también eliminará el directorio.


Elimine el directorio (básicamente una copia de https://.com/a/38201611/1695680 ), Ansible realiza esta operación con rmtree debajo del capó.

- 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 no tiene el lujo de eliminar todo el directorio y volver a crearlo, puede escanearlo en busca de archivos (y directorios) y eliminarlos uno por uno. Lo que llevará un tiempo. Probablemente quiera asegurarse de tener [ssh_connection]/npipelining = True en su ansible.cfg encendido.

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


Este es mi ejemplo.

  1. Instalar repositorio
  2. Instale el paquete rsyslog
  3. detener rsyslog
  4. eliminar todos los archivos dentro de / var / log / rsyslog /
  5. iniciar rsyslog

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


Hay un problema abierto con respecto a esto.

Por ahora, la solución funciona para mí: crear una carpeta vacía localmente y sincronizarla con la remota.

Aquí hay un libro de jugadas de muestra:

- 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


He escrito un módulo ansible personalizado para limpiar archivos basado en múltiples filtros como antigüedad, marca de tiempo, patrones globales, etc.

También es compatible con versiones anteriores ansibles. Se puede encontrar here .

Aquí hay un ejemplo:

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


Quiero asegurarme de que el comando find solo elimine todo dentro del directorio y deje el directorio intacto porque en mi caso el directorio es un sistema de archivos. El sistema generará un error cuando intente eliminar un sistema de archivos, pero esa no es una buena opción. Estoy usando la opción de shell porque esa es la única opción de trabajo que encontré hasta ahora para esta pregunta.

Lo que hice:

Edite el archivo de hosts para incluir algunas variables:

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

Y crea un libro de jugadas:

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

Esto eliminará todos los archivos y directorios en el directorio / sistema de archivos variable COGNOS_HOME. La opción "-mindepth 1" asegura que no se toque el directorio actual.


Realmente no me gustó la solución rm, también ansible te da advertencias sobre el uso de rm. Así que aquí es cómo hacerlo sin la necesidad de rm y sin advertencias ansibles.

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

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


Si bien Ansible todavía está debatiendo implementar 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 }}"

Sin embargo, tenga en cuenta que, con la sincronización, debería poder sincronizar sus archivos (con eliminar) de todos modos.


Sigue abajo:

- 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


Solo una pequeña y limpia plantilla de copiar y pegar de ThorSummoners responde, si está usando Ansible> = 2.3 (la distinción entre archivos y directorios ya no es necesaria).

- 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


Suponiendo que siempre estés en Linux, prueba find cmd.

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

Esto debería borrar archivos / carpetas / ocultos en /home/mydata/web


Usando el módulo de shell ( idempotente también):

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

Solución más limpia si no le importa la fecha de creación y el propietario / permisos:

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


Usando file glob también funcionará. Hay algún error de sintaxis en el código que publicó. He modificado y probado esto debería funcionar.

# 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


prueba el siguiente comando, debería funcionar

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


先 删除 对应 的 目录 , 然后 在 创建 该 目录 , 使用 的 是 嵌套 循环

- 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