使用Ansible获取文件夹的排序列表

时间:2016-09-10 07:23:32

标签: ansible

我有 OS X“El capitan”10.11.6 ,我使用 Ansible 2.1.1.0 在远程Linux服务器上运行一些维护任务 Ubuntu 16.04 Xenial 。我正在尝试将以下文件夹列表排序,因此我可以在需要时删除旧文件夹:

   1  243    3
  55   12  676
  45  232  545

我一直在使用Ansible中的模块find,但它返回一个未排序的列表。有没有一种简单的方法可以通过Ansible实现这一目标?

4 个答案:

答案 0 :(得分:9)

您可以使用sort过滤器对项目进行排序:

- hosts: localhost
  gather_facts: no
  tasks:
    - find: path="/tmp" patterns="test*"
      register: files

    - debug: msg="{{ files.files | sort(attribute='ctime') | map(attribute='path') | list }}"

只需根据需要更改排序属性 但要小心该字符串排序不是数字,因此/releases/1.0.5将在/releases/1.0.10之后。

答案 1 :(得分:3)

有趣的解决方案,非常感谢。但我认为我已经找到了 Ubuntu 中最简单的方法,只需使用ls -v /releases/就可以对所有文件夹应用自然排序:

- name: List of releases in ascendent order  
  command: ls -v /releases/
  register: releases

- debug: msg={{ releases.stdout_lines }}

回复是:

ok: [my.remote.com] => {
    "msg": [
        "0.0.0",
        "0.0.1",
        "0.0.10",
        "1.0.0",
        "1.0.5",
        "2.0.0"
    ]
}

答案 2 :(得分:1)

如果您想查找超过句点的文件,age模块的age_stampfind参数可以为您提供帮助。例如:

# Recursively find /tmp files older than 4 weeks and equal or greater than 1 megabyte
- find: paths="/tmp" age="4w" size="1m" recurse=yes

答案 3 :(得分:1)

听起来你想做的事情很简单,但标准ansible模块并不完全符合你的需要。

作为替代方案,您可以使用自己喜欢的编程语言编写自己的脚本,然后使用copy模块将该脚本传递给主机并使用command执行它。完成后,使用file删除该脚本。

它的缺点是目标主机需要具有运行脚本所需的可执行文件。例如,如果您正在执行python脚本,那么目标主机将需要python

示例:

- name: Send your script to the target host
  copy: src=directory_for_scripts/my_script.sh dest=/tmp/my_script.sh
- name: Execute my script on target host
  command: >
          /bin/bash /tmp/my_script.sh
- name: Clean up the target host by removing script
  file: path=/tmp/my_script.sh state=absent