Ansible 找到匹配的模式目录,删除所有但保留最后 3 个版本

Ansible find matched patterns directory, remove all but keep the last 3 versions

我浏览了 Whosebug 网站,但找不到任何与我想要实现的类似的东西,希望有人能指出我将不胜感激。

我有一个目录,用于存储所有工件 Release Candidate 和 Dev 版本,每当有 bamboo build 启动时。到目前为止,我可以弄清楚如何找到目录模式并验证要删除的结果。但无法过滤结果以排除我想保留的最后 3 个最新版本。

这是结构和代码

Structures

---
- name: Ansible find match directory, keep the last 3 version and remove all other
  hosts: localhost
  connection: local
  vars:
base_dir: "/opt/repo/"
artifacts:
  - "subject-mapper"
  - "artemis-margin-api"
  tasks:
- name: Find Release Candidate Directory Packages
  become: yes
  find:
    paths: "{{ base_dir }}/{{ item }}"
    patterns: 
      - "{{ item }}-[0-9]*.[0-9]*.[0-9]*$"
    use_regex: yes
    recurse: no
    file_type: directory
  loop: "{{ artifacts }}"
  register: output
- debug:
    msg: "{{ output }}"

- name: Filter out the Release Candidate results and keep the last 3 versions
  set_fact:
    files_to_delete: "{{ (files_to_delete|default([])) + (item['files'] | sort(attribute='mtime'))[:-3] }}"
  loop: "{{ output['results'] }}"

- debug: 
    msg: "{{ files_to_delete }}"

- name: Delete the filtered results but keep the last 3 version
  file:
    path: "{{ item.path }}"
    state: absent
  loop: "{{ files_to_delete }}"      
  when: confirm|default(false)|bool
  register: output_delete
- debug: 
    msg: "{{ output_delete }}"

这里

最简单的方法是从每个结果中弹出前三个匹配项:

    - set_fact:
        files_to_delete: "{{ (files_to_delete|default([])) + (item['files'] | sort(attribute='mtime'))[3:] }}"
      loop: "{{ output['results'] }}"