我尝试使用Ansible find
模块的结果,该模块返回在特定文件夹中找到的文件列表。
问题是,当我迭代结果时,我没有文件名,我只有它们的完整路径(包括名称)。
有没有一种简单的方法可以使用下面的find_result
item
s在第二个命令中提供file_name
,如下所示?
- name: get files
find:
paths: /home/me
file_type: "file"
register: find_result
- name: Execute docker secret create
shell: docker secret create <file_name> {{ item.path }}
run_once: true
with_items: "{{ find_result.files }}"
3条答案
按热度按时间5jvtdoz21#
basename
过滤器?还有
dirname
,realpath
,relpath
滤波器。hfwmuf9z2#
这个问题和公认的答案是伟大的时间,他们写的。然而,我想留下一个关于 * 当前首选 * 的方法的说明。
https://docs.ansible.com/ansible/latest/user_guide/playbooks_loops.html#migrating-to-loop
随着Ansible 2.5的发布,执行循环的推荐方法是使用new loop关键字而不是with_X样式的循环。
我已经看到这种常见模式在这种文件循环组合中的发展。
这会遍历目录中的某类文件(python文件),并对它们的文件名执行某个操作(执行它们),使用它们的文件名是合理的,因为
chdir
会将您放在这些文件所在的目录中。在
loop_control
中使用相同的文件名是很重要的,因为否则它会打印item
,这不仅仅是绝对路径,而是一打其他完全不可读的文件属性。这是可行的,但它也忽略了
loop
更改Ansible的动机。这也可以工作,将2个任务替换为1:在这个循环中,
item
是绝对路径。您可能更喜欢打印它,在这种情况下完全丢失loop_control
。mbjcgjjk3#
你需要从文件路径中提取文件名,变得容易多了。在您的案例中:{{find_result.path|基本名称