我有一个包含各种文件的中型目录树:
- /some/place/distfiles/foo-1.2.jar
- /some/place/distfiles/subdir/foo-1.3.jar
- /some/place/distfiles/bar-1.1.jar
- /some/place/distfiles/bar-1.1.2.jar
我用查找模块 https://docs.ansible.com/ansible/latest/modules/find_module.html获得完整列表,但我只需要latest每个版本foo and bar。例如,上面的集合需要简化为:
- /some/place/distfiles/subdir/foo-1.3.jar
- /some/place/distfiles/bar-1.1.2.jar
不,我不能依赖文件的时间戳——只能依赖文件名的数字部分......
有人可以建议一种优雅的方法吗?
这将是一些不小的 jinja2 量,因此您可能会更高兴编写自定义模块,这样您就可以使用实际的编程语言工作(您仍然可以使用find:
and register:
捕获文件名列表,然后将其提供给您的自定义模块,以根据您的规则汇总每个文件的“最新”)
也就是说,我猜version test https://docs.ansible.com/ansible/2.9/user_guide/playbooks_tests.html#version-comparison可用于在将项目拆分为后查找最新的项目tuple[str, str]
从其基本名称到版本号:
- find:
paths:
- /some/place/distfiles
# etc
register: my_jars
- set_fact:
versions_by_filename: >-
{%- set results = {} -%}
{%- for f in my_jars.files -%}
{%- set bn = f.path | basename
| regex_replace(ver_regex, '\\1') -%}
{%- set v = f.path | regex_replace(ver_regex, '\\2') -%}
{%- set _ = results.setdefault(bn, []).append(v) -%}
{%- endfor -%}
{{ results }}
vars:
ver_regex: '(.*)-([0-9.-]+)\.jar'
- set_fact:
most_recent: >-
{%- set results = {} -%}
{%- for fn, ver_list in versions_by_filename.items() -%}
{%- set tmp = namespace(latest=ver_list[0]) -%}
{%- for v in ver_list -%}
{%- if tmp.latest is version(v, '<') -%}
{%- set tmp.latest = v -%}
{%- endif -%}
{%- endfor -%}
{%- set _ = results.update({fn: tmp.latest}) -%}
{%- endfor -%}
{{ results }}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)