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

And*_*der 7 ansible

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

/releases/0.0.0
/releases/0.0.1
/releases/0.0.10
/releases/1.0.0
/releases/1.0.5
/releases/2.0.0
Run Code Online (Sandbox Code Playgroud)

我一直在尝试使用Ansible中的模块find,但它返回一个未排序的列表.使用Ansible有一个简单的方法来实现这一目标吗?

Kon*_*rov 10

您可以使用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 }}"
Run Code Online (Sandbox Code Playgroud)

只需根据需要更改排序属性即可.
但要注意字符串排序不是数字,所以/releases/1.0.5将继续/releases/1.0.10.

  • 我不知道 jinja2 排序过滤器,谢谢@Konstantin Suvorov。但是正如您所说,此解决方案不符合规范。 (2认同)

And*_*der 9

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

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

- debug: msg={{ releases.stdout_lines }}
Run Code Online (Sandbox Code Playgroud)

回应是:

ok: [my.remote.com] => {
    "msg": [
        "0.0.0",
        "0.0.1",
        "0.0.10",
        "1.0.0",
        "1.0.5",
        "2.0.0"
    ]
}
Run Code Online (Sandbox Code Playgroud)

  • 这仅适用于 GNU `ls`,不适用于 Mac 上的 `ls`。 (2认同)