2016-07-05 7 views
67

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

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

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

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

Я использую анзибль 2.1.0.0

+0

выглядит как ошибка. – ceving

ответ

61

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

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

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

+0

Можете ли вы предоставить код с отсутствующими котировками и где они должны быть, продолжает бросать ошибки, когда я пытался. – Abbas

+1

цитаты не требуются. Это только мой рабочий код. artifact_path похож на/app/my_app/work/ –

+0

Какую ошибку вы получаете? Пожалуйста, опубликуйте его. –

37

Использование модуля оболочки:

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

Cleanest решение, если вы не заботитесь о дате создания:

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

Работает, но не удаляет файлы, начиная с. как .htaccess – Abbas

+0

Шелл работал и для меня. Точная же задача, но поменялась 'shell' на' command' и она работает – SomethingOn

+0

Подстановочные знаки не будут работать с командой, так как они требуют оболочки для расширения – JamesP

12

попробовать следующую команду, он должен работать

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

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

вы пропустили, чтобы правильно скрыть последнюю строку с {{,}}, чтобы получить 'with_items: "{{content.stdout_lines}}" ' –

+0

Опасно использовать вывод' ls' для получения имен файлов, поскольку он неправильно печатает имена файлов со специальными символами, такими как новые строки. – bfontaine

1

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

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

'with_fileglob' работает только на локальном компьютере, а не удаленном; не правда ли? –

+0

True .. with_fileglob для локальных только –

+0

Кроме того, это не удаляет каталоги, просто удаляются файлы. – vikas027

16

Удалите каталог (в основном копия https://stackoverflow.com/a/38201611/1695680), анзибль делает эту операцию с 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 
     }} 
0

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

- 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

-4

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

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

Хотя анзибль еще обсуждает реализовать 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 }}" 

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

1

проблема пустых папок здесь, https://github.com/ansible/ansible/issues/18910

и сейчас, это решение работает для меня.

создать пустую папку

makedir /tmp/empry 

затем добавьте следующие строки в анзибль PlayBook

- name: Empty remote directory 
synchronize: 
    src: /tmp/empry/ 
    dest: /home/mydata/web/ 
    delete: yes 
    recursive: yes