使用Ansible获取已排序的文件夹列表
我有OSX“El capitan”10.11.6,我正在使用Ansible 2.1.1.0在远程Linux服务器上运行一些维护任务Ubuntu16.04 Xenial。我正在尝试在远程计算机(Linux)上对以下文件夹列表进行排序,以便在需要时删除旧文件夹:使用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中的模块,但它返回
/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
文本中数字的自然排序(版本)。我编辑了我的答案,最初我写了“数字排序”,但实际上这是自然排序。这只适用于GNUls
,不是mac电脑上的ls,你说得对,康斯坦丁,我用OSX运行Ansible,但是命令ls-v实际上是在远程服务器Ubuntu 16.04上执行的。很高兴知道它在OSX上不起作用