函数中的 Ansible 更新变量

Ansible update variable in function

我制作了一个有两个任务的剧本

第一个任务是获取所选目录中的所有目录。
第二个任务是删除目录。但是,如果列表长度超过两个,我只想删除一个目录。

---
- name: cleanup Backend versions
  hosts: backend
  become: true
  become_user: root
  vars:
    backend_deploy_path: /opt/app/test/
  tasks:
    - name: Get all the versions
      ansible.builtin.find:
        paths: "{{ backend_deploy_path }}"
        file_type: directory
      register: file_stat

    - name: Delete old versions
      ansible.builtin.file:
        path: "{{ item.path }}"
        state: absent
      with_items: "{{ file_stat.files }}"
      when: file_stat.files|length > 2

当我 运行 这个剧本时,它会删除所有目录而不是保留三个目录。

我的问题是如何保持变量更新?以便它在每次尝试删除目录时都不断检查?

这是不可能的,一旦执行了一个模块,结果就保存在变量中,不会随着节点状态的变化而动态变化。

您应该做的是用 slice notation 限制您正在循环的列表,以排除上述列表的最后三项:files[:-3].

因此,您删除文件的任务如下所示:

- name: Delete old versions
  ansible.builtin.file:
    path: "{{ item.path }}"
    state: absent
  loop: "{{ file_stat.files[:-3] }}"

旁注:您可能希望 sort find 结果也基于文件夹的创建日期,例如:

loop: "{{ (file_stat.files | sort(attribute='ctime'))[:-3] }}"