Ansible:删除文件和文件夹,同时排除一些

Ansible:删除文件和文件夹,同时排除一些,ansible,Ansible,在我的Ansible Playbook中,我希望有一个任务可以从应用程序目录中删除旧文件和文件夹。这个简单任务的转折点是需要保留一些文件或文件夹。想象一下这样的情景: /opt/application - /config - *.properties - special.yml - /logs - /bin - /var - /data - /templates 假设我想完整地保存/logs,/var/data,并从/config中保存speci

在我的Ansible Playbook中,我希望有一个任务可以从应用程序目录中删除旧文件和文件夹。这个简单任务的转折点是需要保留一些文件或文件夹。想象一下这样的情景:

/opt/application
  - /config
    - *.properties
    - special.yml
  - /logs
  - /bin
  - /var
    - /data
    - /templates
假设我想完整地保存
/logs
/var/data
,并从
/config
中保存
special.yml

(我目前无法提供确切的代码,因为我离开工作时为此感到沮丧,在冷静下来后,我现在正在家里写这个问题)

我的想法是有两个排除列表,一个保存文件夹,一个保存文件。然后我使用
find
模块首先将应用程序目录中的文件夹放入一个变量,将其余文件放入另一个变量。之后,我想使用
文件
模块删除不在排除列表中的每个文件夹和文件

(伪YML,因为我的Ansible还不够流利,所以我无法写出一个结构合理的示例;不过应该足够接近)


我不明白的是如何正确地构造
when
子句。甚至可以这样做吗?

首先使用前面提到的“查找”模块来获取所有文件和目录的总列表。注册到变量,如
所有对象

- name: Get list of all files recursively
  find:
    path: /opt/application/
    recurse: yes
  register: all_objects
然后手动列出你想要保留的东西

vars:
  keep_these:
    - /logs
    - /var/data
    - /config/special.yml
然后,此任务应删除列表中除内容以外的所有内容:

- name: Delete all files and directories except exclusions
  file:
    path: "{{ item.path }}"
    state: absent
    recurse: true
  with_items: "{{ all_objects.files }}"
  when: item.path not in keep_these

我认为这一总体战略应该奏效。。。我唯一不确定的是find模块中注册变量的确切嵌套结构。您可能必须使用调试模块才能使其完全正确

我认为文件模块中没有when子句。 但您可能会实现以下所需:

- name: Find /opt/application all directories, exclude logs, data, and config
  find:
    paths: /opt/application
    excludes: 'logs,data,config'
  register: files_to_delete

- name: Ansible remove file glob
  file:
    path: "{{ item.path }}"
    state: absent
  with_items: "{{ files_to_delete.files }}"

我希望这就是您所需要的。

不幸的是,
排除
选项似乎不起作用。我在正确的Ansible版本上,有时它会做它的事情。它不会同时过滤文件和文件夹,即使我指定了
文件类型:any
。我越想,我需要同时过滤这两个,否则,如果做两个查找,一个为dir,一个为file,我将在排除的dir中查找文件-因为排除文件时我似乎无法排除dir。我有一个类似的想法,但在我的头脑中它不起作用。我想排除
var/data/
中的所有内容,因此我将
var/data
放入
keep\u这些
。在
所有对象.files
中有一个文件
/opt/application/var/data/awome\u file.txt
。我必须将子字符串与之匹配,否则
item.path不在keep\u中这些
不会做正确的事情。谢谢您的回答。我们认为这个问题是一种潜在的不明智的目录布局的味道,我们将首先修复它,然后删除目录更直接。
- name: Find /opt/application all directories, exclude logs, data, and config
  find:
    paths: /opt/application
    excludes: 'logs,data,config'
  register: files_to_delete

- name: Ansible remove file glob
  file:
    path: "{{ item.path }}"
    state: absent
  with_items: "{{ files_to_delete.files }}"