如何使用ansible删除最旧的目录

时间:2020-05-24 04:29:02

标签: ansible

如何使用ansible删除最早的目录。 假设我有以下树形结构

Parent Directory
 -Dir2020-05-20
 -Dir2020-05-21
 -Dir2020-05-22
 -Dir2020-05-23

现在每次运行ansible剧本时,它都应删除最旧的目录,例如,如果我们将其创建日期定为2020-05-20,则应在其首次运行中删除Dir2020-05-20。 文件模块的age属性没有帮助,因为我必须非常随机地运行此剧本,并且我想保持有限的数量。这些目录。

2 个答案:

答案 0 :(得分:0)

只需将dirpath分配到所有这些目录都存在的“父目录”的路径中

---
  - hosts: localhost
    vars:
      dir_path: "/home/harshit/ansible/test/" ##parent directory path, make sure it ends with a slash
    tasks:
        - name: find oldest directory
          shell:
            cmd: "ls `ls -tdr | head -n 1 `"
            chdir:  "{{dir_path}}"
          register: dir_name_to_delete
        - name: "delete oldest directory: {{dir_path}}{{dir_name_to_delete.stdout}}"
          file:
            state: absent
            path: "{{dir_path}}{{dir_name_to_delete.stdout}}"

答案 1 :(得分:0)

考虑建议的做法是,在任何情况下都不要使用shellcommand模块,对于这种情况,我建议使用纯ansible解决方案:

- name: Get directory list
  find:
    paths: "{{ target_directory }}"
    file_type: directory
  register: found_dirs

- name: Get the oldest dir
  set_fact:
    oldest_dir: "{{ found_dirs.files | sort(attribute='mtime') | first }}"

- name: Delete oldest dir
  file:
    state: absent
    path: "{{ oldest_dir.path }}"
  when:
    - found_dirs.files | count > 3

有两种方法可以知道使用find模块找到了多少文件-使用像matched这样的return value when: found_dirs.matched > 3或使用count过滤器。我更喜欢后一种方法,因为我在很多其他情况下都使用此过滤器,所以这只是一种习惯。

供您参考,ansible具有whole bunch个有用的过滤器(例如,我在这里使用了countsort,但有很多过滤器)。当然,无需记住这些过滤器名称,只需记住它们的存在,在许多情况下可能会有用。