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

使用Ansible获取已排序的文件夹列表,ansible,Ansible,我有OSX“El capitan”10.11.6,我正在使用Ansible 2.1.1.0在远程Linux服务器上运行一些维护任务Ubuntu16.04 Xenial。我正在尝试在远程计算机(Linux)上对以下文件夹列表进行排序,以便在需要时删除旧文件夹: /releases/0.0.0 /releases/0.0.1 /releases/0.0.10 /releases/1.0.0 /releases/1.0.5 /releases/2.0.0 我一直在尝试Ansible中的模块,但它返回

我有OSX“El capitan”10.11.6,我正在使用Ansible 2.1.1.0在远程Linux服务器上运行一些维护任务Ubuntu16.04 Xenial。我正在尝试在远程计算机(Linux)上对以下文件夹列表进行排序,以便在需要时删除旧文件夹:

/releases/0.0.0
/releases/0.0.1
/releases/0.0.10
/releases/1.0.0
/releases/1.0.5
/releases/2.0.0

我一直在尝试Ansible中的模块,但它返回一个未排序的列表。使用Ansible是否有一种简单的方法来实现这一点?

如果您想查找超过一个时间段的文件,可能
age
age\u stamp
模块的参数可以帮助您。例如:

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

您可以使用
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
之后进行。听起来你想做的事情很简单,但是标准的
ansible
模块并没有你需要的东西

或者,您可以使用自己喜欢的编程语言编写自己的脚本,然后使用
copy
模块将脚本传递给主机,并使用
命令执行脚本。完成后,使用
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

有趣的解决方案,谢谢大家。但是我想我已经在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"
    ]
}

你“试图得到”是什么意思?您的输入是什么,您希望将输出传递给什么?我不知道jinja2排序过滤器,谢谢@Konstantin Suvorov。但正如您所说,此解决方案不符合规范。您可以使用
排序(attribute='ctime',reverse=True)
(取自)有趣的。。。
ls-v
如何为您提供数字排序?查看
ls--help
我刚刚发现:
ls-v
文本中数字的自然排序(版本)。我编辑了我的答案,最初我写了“数字排序”,但实际上这是自然排序。这只适用于GNU
ls
,不是mac电脑上的ls,你说得对,康斯坦丁,我用OSX运行Ansible,但是命令ls-v实际上是在远程服务器Ubuntu 16.04上执行的。很高兴知道它在OSX上不起作用