ansible - linux - 在ansible中找到最后一分钟修改过的最新文件?

我有一个特定目录中的文件列表,如下所示:


david@host:~/jobs/process/workspace/files$ ls -lrth


total 68K


-rw-r--r-- 1 david david 7.8K Oct 1 11:10 golden_proc.init.1569953435497


-rw-r--r-- 1 david david 7.7K Oct 2 12:11 golden_proc.init.1570043494149


-rw-r--r-- 1 david david 7.7K Oct 2 20:15 golden_proc.init.1570072510929



每个文件名都以时间戳结束,现在我需要找到一个被修改或创建了一分钟的最新的文件。

  • 如果没有这样的文件,则可以通过“cannot find any file”从ansible成功返回。
  • 如果有这样的文件,那么将该文件复制到"/tmp"文件夹,
  • 如果在最后一分钟生成或修改了多个文件,请使用最新的。

这可以做到的吗?我看到ansible中有一个find模块,但不确定如何使用该模块来实现上述功能?


---


- name: Play 1


 hosts: 127.0.0.1


 tasks:


 - name: find the latest file


 find: paths=/var/lib/jobs/workspace/process/files


 file_type=file


 age=-{{ time_window }}m


 age_stamp=mtime


 register: files



时间:


- debug:


 msg: '{{ files.files if files.files|count > 0 else"cannot find any file" }}'



此语法使用的是内联if以及count筛选器

考虑到你现在需要最新的文件,还可以使用一组Jinja文件管理器: filter sort将帮助你按修改时间对文件进行排序,而过滤first将帮助你只获取数组的第一个元素。


- debug:


 msg: '{{ (files.files | sort(attribute="mtime", reverse=true) | first).path }}'



一个完整的可工作的供你测试:


---


- hosts: localhost


 connection: locale



 vars:


 files:


 - { 'name': 'a', 'time': '201901010000.00' }


 - { 'name': 'b', 'time': '201901020000.00' }


 - { 'name': 'c', 'time': '201901030000.00' }



 tasks:


 - name: creating a bunch of matching files


 file:


 path: '/data/{{ item.name }}'


 state: touch


 with_items: '{{ files }}'



 - name: aging those files


 file:


 path: '/data/{{ item.name }}'


 modification_time: '{{ item.time }}'


 with_items: '{{ files }}'



 - name: find the latest file


 find: paths=/data


 file_type=file


 age=-10000000w


 age_stamp=mtime


 register: find_files



 - debug:


 msg: '{{ (find_files.files | sort(attribute="mtime", reverse=true) | first).path if find_files.files|count > 0 else"cannot find any file" }}'



 - name: removing files to test the behaviour with no matching files


 file:


 path: '/data/{{ item.name }}'


 state: absent


 with_items: '{{ files }}'



 - name: find the latest file


 find: paths=/data


 file_type=file


 age=-10000000w


 age_stamp=mtime


 register: find_files



 - debug:


 msg: '{{ (find_files.files | sort(attribute="mtime", reverse=true) | first).path if find_files.files|count > 0 else"cannot find any file" }}'



这个脚步的相应输出


PLAY [localhost] **********************************************************************************************************************************************



TASK [Gathering Facts] ****************************************************************************************************************************************


ok: [localhost]



TASK [creating a bunch of matching files] *********************************************************************************************************************


changed: [localhost] => (item={'name': 'a', 'time': '201901010000.00'})


changed: [localhost] => (item={'name': 'b', 'time': '201901020000.00'})


changed: [localhost] => (item={'name': 'c', 'time': '201901030000.00'})



TASK [aging those files] **************************************************************************************************************************************


changed: [localhost] => (item={'name': 'a', 'time': '201901010000.00'})


changed: [localhost] => (item={'name': 'b', 'time': '201901020000.00'})


changed: [localhost] => (item={'name': 'c', 'time': '201901030000.00'})



TASK [find the latest file] ***********************************************************************************************************************************


ok: [localhost]



TASK [debug] **************************************************************************************************************************************************


ok: [localhost] => {


"msg":"/data/c"


}



TASK [removing files to test the behaviour with no matching files] ********************************************************************************************


changed: [localhost] => (item={'name': 'a', 'time': '201901010000.00'})


changed: [localhost] => (item={'name': 'b', 'time': '201901020000.00'})


changed: [localhost] => (item={'name': 'c', 'time': '201901030000.00'})



TASK [find the latest file] ***********************************************************************************************************************************


ok: [localhost]



TASK [debug] **************************************************************************************************************************************************


ok: [localhost] => {


"msg":"cannot find any file"


}



PLAY RECAP ****************************************************************************************************************************************************


localhost : ok=8 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 



...