我有 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实现这一目标?
答案 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_stamp
和find
参数可以为您提供帮助。例如:
# 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