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