Подтвердить что ты не робот

Ansible: Как удалить файлы и папки внутри каталога?

Приведенный ниже код удаляет только первый файл, который он получает внутри веб-каталога. Я хочу удалить все файлы и папки внутри веб-каталога и сохранить веб-каталог. Как я могу это сделать?

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

Примечание: я пробовал rm -rf используя команду и оболочку, но они не работают. Возможно, я использую их неправильно.

Любая помощь в правильном направлении будет оценена.

Я использую ansible 2.1.0.0

4b9b3361

Ответ 1

Ниже код удалит все содержимое artifact_path

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

Примечание: это также удалит каталог.

Ответ 2

Используя модуль оболочки (тоже идемпотент):

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

Чистое решение, если вас не интересует дата создания и владелец/разрешения:

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

Ответ 3

Удалите каталог (в основном это копия fooobar.com/questions/97985/...), Ansible выполняет эту операцию с rmtree под капотом.

- 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

Если у вас нет возможности удалить весь каталог и создать его заново, вы можете отсканировать его на наличие файлов (и каталогов) и удалить их один за другим. Что займет некоторое время. Вы, вероятно, хотите убедиться, что у вас есть [ssh_connection]\npipelining = True в вашем 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
      }}

Ответ 4

попробуйте выполнить команду ниже, она должна работать

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

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

Ответ 5

Мне действительно не понравилось решение rm, также ansible дает вам предупреждения об использовании rm. Итак, вот как это сделать без необходимости использования rm и без предупреждений.

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

источник: http://www.mydailytutorials.com/ansible-delete-multiple-files-directories-ansible/

Ответ 6

Создана общая перестроенная и отказоустойчивая реализация из всех комментариев и предложений:

# 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

Ответ 7

Использование файла glob также будет работать. В коде, который вы опубликовали, есть синтаксическая ошибка. Я модифицировал и тестировал это должно работать.

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

Ответ 8

В то время как Ansible все еще обсуждает реализацию 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 }}"

Обратите внимание, что при синхронизации вы должны иметь возможность синхронизировать ваши файлы (с удалением) в любом случае.

Ответ 9

В связи с этим существует открытый вопрос.

На данный момент решение работает для меня: создать пустую папку локально и синхронизировать ее с удаленной.

Вот пример книги:

- 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

Ответ 10

Я хочу убедиться, что команда find только удаляет все внутри каталога и оставляет каталог нетронутым, потому что в моем случае каталог является файловой системой. Система будет выдавать ошибку при попытке удалить файловую систему, но это не очень хорошая опция. Я использую опцию оболочки, потому что это единственная рабочая опция, которую я нашел до сих пор для этого вопроса.

Что я сделал:

Отредактируйте файл hosts, добавив некоторые переменные:

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

И создайте пьесу:

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

Это удалит все файлы и каталоги в каталоге/файловой системе переменной COGNOS_HOME. Опция "-mindepth 1" гарантирует, что текущий каталог не будет затронут.

Ответ 11

Я написал специальный модуль для очистки файлов на основе нескольких фильтров, таких как возраст, временная метка, шаблоны глобусов и т.д.

Он также совместим с более старыми версиями. Это можно найти здесь.

Вот пример:

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

Ответ 12

Если вы используете Ansible> = 2.3, просто маленький шаблон для копирования и вставки из ThorSummoners (различие между файлами и директориями больше не требуется).

- 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

Ответ 13

Следуйте ниже:

- 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

Ответ 14

Вот что я придумала:

- name: Get directory listing
  find:
    path: "{{ directory }}" 
    file_type: any
    hidden: yes
  register: directory_content_result

- name: Remove directory content
  file:
    path: "{{ item.path }}" 
    state: absent
  with_items: "{{ directory_content_result.files }}" 
  loop_control:
    label: "{{ item.path }}" 

Во-первых, мы получаем список каталогов с помощью find с настройкой

  • file_type - any, чтобы мы не пропустили вложенные каталоги и ссылки
  • hidden - yes, поэтому мы не пропускаем скрытые файлы
  • также не устанавливайте recurse на yes, так как это не только не нужно, но может увеличить время выполнения.

Затем мы просматриваем этот список с помощью модуля file. Вывод немного подробный, поэтому loop_control.label поможет нам с ограничением вывода (наш совет здесь).


Но я обнаружил, что предыдущее решение было несколько медленным, поскольку оно перебирает содержимое, поэтому я решил:

- name: Get directory stats
  stat:
    path: "{{ directory }}"
  register: directory_stat

- name: Delete directory
  file:
    path: "{{ directory }}"
    state: absent

- name: Create directory
  file:
    path: "{{ directory }}"
    state: directory
    owner: "{{ directory_stat.stat.pw_name }}"
    group: "{{ directory_stat.stat.gr_name }}"
    mode: "{{ directory_stat.stat.mode }}"
  • получить свойства каталога с помощью stat
  • удалить каталог
  • воссоздать каталог с такими же свойствами.

Этого было достаточно для меня, но вы также можете добавить attributes, если хотите.

Ответ 15

Предполагая, что вы всегда в Linux, попробуйте find cmd.

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

Это должно уничтожить файлы/папки/скрытые под /home/mydata/web

Ответ 16

T 删除 的 目录 , 然后 在 该 目录 目录 T T T
  - 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

Ответ 17

Это мой пример.

  1. Установить репо
  2. Установить пакет rsyslog
  3. остановить rsyslog
  4. удалить все файлы внутри /var/log/rsyslog/
  5. начать 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
    

Ответ 18

Ниже работал у меня,

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