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

时间:2019-04-09 19:27:54

标签: ansible

在我的Ansible Playbook中,我想要执行一项任务,该任务将从应用程序的目录中删除旧文件和文件夹。与此简单的任务不同的是,需要保留一些文件或文件夹。想象这样的事情:

/opt/application
  - /config
    - *.properties
    - special.yml
  - /logs
  - /bin
  - /var
    - /data
    - /templates

假设我想完全保留/logs/var/data,而我想保留/config。{p>

(我目前无法提供确切的代码,因为我对此感到沮丧,在冷静下来之后,我现在要在家写这个问题)

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

(伪YML,因为我对Ansible的理解还不够流利,所以我可以整理一个结构正确的示例;尽管它应该足够接近)

file

我不知道如何正确构造file: path: "{{ item.path }}" state: absent with_items: "{{ found_files_list.files }}" when: well, that is the big question 子句。甚至有可能这样吗?

2 个答案:

答案 0 :(得分:0)

首先像您所说的那样使用查找模块来获取所有文件和目录的总列表。注册到变量all_objects

- 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

我认为这种通用策略应该有效……我唯一不确定的是查找模块中已注册变量的确切嵌套嵌套。您可能需要调试模块才能正确使用它。

答案 1 :(得分:0)

我不认为文件模块中包含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 }}"

我希望这是您所需要的。