【问题标题】:Get sorted list of folders with Ansible使用 Ansible 获取已排序的文件夹列表
【发布时间】:2016-09-10 07:23:31
【问题描述】:

我有 OS X "El capitan" 10.11.6,我正在使用 Ansible 2.1.1.0 在远程 Linux 服务器上运行一些维护任务 Ubuntu 16.04 赛尼尔。我正在尝试获取在远程计算机 (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 中的模块 find,但它返回一个未排序的列表。有没有一种简单的方法可以通过 Ansible 实现这一目标?

【问题讨论】:

  • 你“试图得到”是什么意思?你的输入是什么,你想把输出传递给什么?

标签: ansible


【解决方案1】:

您可以使用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 之后。

【讨论】:

  • 我不知道 jinja2 排序过滤器,谢谢@Konstantin Suvorov。但正如你所说,这个解决方案不符合规范。
  • 你可以用sort(attribute='ctime', reverse=True)反向排序(取自here
【解决方案2】:

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

【讨论】:

  • 有趣...ls -v 是如何为您提供数字排序的?
  • 查看ls --help 我刚刚发现了这个:ls -v 文本中自然排序的(版本)数字。
  • 我已经编辑了我的答案,最初我写的是“数字排序”,但这实际上是自然排序
  • 这仅适用于 GNU ls,不适用于 Mac 上的 ls
  • 你说对了 Konstantin,我使用 OS X 运行 Ansible,但命令 ls -v 实际上是在远程服务器 Ubuntu 16.04 Xenial 上执行的。很高兴知道它不适用于 OS X
【解决方案3】:

如果您想查找超过某个句点的文件,也许find 模块的ageage_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

【讨论】:

    【解决方案4】:

    听起来你想做的事情很简单,但标准的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
    

    【讨论】:

      猜你喜欢
      • 2019-12-07
      • 2019-05-12
      • 1970-01-01
      • 2011-03-27
      • 2015-09-08
      • 1970-01-01
      • 2011-04-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多