函数中的 Ansible 更新变量

标签 ansible

我做了一个有两个任务的剧本

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

---
- 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] }}"

关于函数中的 Ansible 更新变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71483602/

相关文章:

git remote set-url origin 的 Ansible 等价物

python - Ansible 更新到 2.8 后找不到 Python 库

ansible - 如何删除没有任何数据的空白行?

ansible - 如何编写仅在任务文件中的任何其他先前任务已更改时才运行的Ansible角色任务?

python - libselinux-python 绑定(bind)和 ansible

使用 Ansible SSH 进入 Vagrant 机器

elasticsearch - 如何以非交互方式在 Elasticsearch 中启用 TLS?

ansible - 我如何在任职角色之间保留任职变量?

boolean - Ansible 到底如何解析 boolean 变量?

regex - 来自标准输出的ansible解析文本字符串