gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 12:08:36 25 4
gpt4 key购买 nike

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

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

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

  • 如果没有这样的文件,那么如果可能的话,通过记录“找不到任何文件”从 ansible 成功返回。
  • 如果有这样的文件,则将该文件复制到“/tmp”文件夹。
  • 如果在最后一分钟生成或修改了多个文件,则使用最新的一个。

这可以在 ansible 中实现吗?我看到 ansible 中有一个查找模块,但不确定如何使用该模块使上述功能正常工作?

---
- 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

最佳答案

这绝对是可能的,您甚至离解决方案还很近。

正如您可能已经看到它已经对您的find 进行了调试,它的返回包含一个文件 列表,这个列表如果您没有文件,将只是空的。

所以在 Jinja 中很容易看到列表是空的

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

此语法使用 inline if以及 count filter .

关于您现在想要最新文件的事实,您还可以使用一组 Jinja 文件管理器:filter sort将帮助您按修改时间对文件进行排序,filter first将帮助您仅获取列表的第一个元素。

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

现在你只需要将两者组合成一个长的 Jinja 表达式:

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

为了复制文件,您将需要一个特定于 Ansible 的额外 Jinja 过滤器,即 basename , 为了从文件的完整路径中获取文件名

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

但您还需要 when声明,因此如果没有匹配的文件,您的副本将被跳过:

- name: Copy file, if found                 
copy:
src: '{{ (files.files | sort(attribute="mtime", reverse=true) | first).path }}'
dest: '/tmp/{{ (files.files | sort(attribute="mtime", reverse=true) | first).path | basename }}'
when: files.files|count > 0

供您测试的完整工作手册:

---
- hosts: localhost
connection: locale

vars:
var_files:
- { 'name': 'a', 'time': 86400 }
- { 'name': 'b', 'time': 30 }
- { 'name': 'c', 'time': 20 }

tasks:
- name: creating a bunch of matching files
file:
path: '/data/{{ item.name }}'
state: touch
with_items: '{{ var_files }}'

- name: aging those files
file:
path: '/data/{{ item.name }}'
modification_time: '{{ "%Y%m%d%H%M.%S" | strftime( ( ansible_date_time.epoch | int ) - item.time ) }}'
with_items: '{{ var_files }}'

- name: find the latest file
find: paths=/data
file_type=file
age=-1m
age_stamp=mtime
register: files

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

- name: Copy file, if found
copy:
src: '{{ (files.files | sort(attribute="mtime", reverse=true) | first).path }}'
dest: '/tmp/{{ (files.files | sort(attribute="mtime", reverse=true) | first).path | basename }}'
when: files.files|count > 0

- name: removing files to test the behaviour with no matching files
file:
path: '/data/{{ item.name }}'
state: absent
with_items: '{{ var_files }}'

- name: find the latest file
find: paths=/data
file_type=file
age=-1m
age_stamp=mtime
register: files

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

- name: Copy file, if found
copy:
src: '{{ (files.files | sort(attribute="mtime", reverse=true) | first).path }}'
dest: '/tmp/{{ (files.files | sort(attribute="mtime", reverse=true) | first).path | basename }}'
when: files.files|count > 0

以及该剧本的相应输出

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

TASK [Gathering Facts] **************************************************************************************************************************
ok: [localhost]

TASK [creating a bunch of matching files] *******************************************************************************************************
changed: [localhost] => (item={'name': 'a', 'time': 86400})
changed: [localhost] => (item={'name': 'b', 'time': 30})
changed: [localhost] => (item={'name': 'c', 'time': 20})

TASK [aging those files] ************************************************************************************************************************
changed: [localhost] => (item={'name': 'a', 'time': 86400})
changed: [localhost] => (item={'name': 'b', 'time': 30})
changed: [localhost] => (item={'name': 'c', 'time': 20})

TASK [find the latest file] *********************************************************************************************************************
ok: [localhost]

TASK [debug] ************************************************************************************************************************************
ok: [localhost] => {
"msg": "/data/c"
}

TASK [Copy file, if found] **********************************************************************************************************************
changed: [localhost]

TASK [removing files to test the behaviour with no matching files] ******************************************************************************
changed: [localhost] => (item={'name': 'a', 'time': 86400})
changed: [localhost] => (item={'name': 'b', 'time': 30})
changed: [localhost] => (item={'name': 'c', 'time': 20})

TASK [find the latest file] *********************************************************************************************************************
ok: [localhost]

TASK [debug] ************************************************************************************************************************************
ok: [localhost] => {
"msg": "cannot find any file"
}

TASK [Copy file, if found] **********************************************************************************************************************
skipping: [localhost]

PLAY RECAP **************************************************************************************************************************************
localhost : ok=9 changed=4 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0

关于linux - 在 ansible 中找到最后一分钟内修改的最新文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58243105/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com