Ответ 1
Ниже код удалит все содержимое artifact_path
- name: Clean artifact path
file:
state: absent
path: "{{ artifact_path }}/"
Примечание: это также удалит каталог.
Приведенный ниже код удаляет только первый файл, который он получает внутри веб-каталога. Я хочу удалить все файлы и папки внутри веб-каталога и сохранить веб-каталог. Как я могу это сделать?
- 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
Ниже код удалит все содержимое artifact_path
- name: Clean artifact path
file:
state: absent
path: "{{ artifact_path }}/"
Примечание: это также удалит каталог.
Используя модуль оболочки (тоже идемпотент):
- shell: /bin/rm -rf /home/mydata/web/*
Чистое решение, если вас не интересует дата создания и владелец/разрешения:
- file: path=/home/mydata/web state=absent
- file: path=/home/mydata/web state=directory
Удалите каталог (в основном это копия 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
}}
попробуйте выполнить команду ниже, она должна работать
- shell: ls -1 /some/dir
register: contents
- file: path=/some/dir/{{ item }} state=absent
with_items: {{ contents.stdout_lines }}
Мне действительно не понравилось решение 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/
Создана общая перестроенная и отказоустойчивая реализация из всех комментариев и предложений:
# 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
Использование файла glob также будет работать. В коде, который вы опубликовали, есть синтаксическая ошибка. Я модифицировал и тестировал это должно работать.
- name: remove web dir contents
file:
path: "{{ item }}"
state: absent
with_fileglob:
- "/home/mydata/web/*"
В то время как 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 }}"
Обратите внимание, что при синхронизации вы должны иметь возможность синхронизировать ваши файлы (с удалением) в любом случае.
В связи с этим существует открытый вопрос.
На данный момент решение работает для меня: создать пустую папку локально и синхронизировать ее с удаленной.
Вот пример книги:
- 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
Я хочу убедиться, что команда 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" гарантирует, что текущий каталог не будет затронут.
Я написал специальный модуль для очистки файлов на основе нескольких фильтров, таких как возраст, временная метка, шаблоны глобусов и т.д.
Он также совместим с более старыми версиями. Это можно найти здесь.
Вот пример:
- cleanup_files:
path_pattern: /tmp/*.log
state: absent
excludes:
- foo*
- bar*
Если вы используете 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
Следуйте ниже:
- 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
Вот что я придумала:
- 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
, если хотите.
Предполагая, что вы всегда в 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
- 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
Это мой пример.
начать 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
Ниже работал у меня,
- name: Ansible delete html directory
file:
path: /var/www/html
state: directory