我试图使用Ansible find 命令的结果,该命令返回它在特定文件夹中找到的文件列表,问题是,当我迭代结果时,我做没有文件名,我只有他们的完整路径(包括名称),是否有一种简单的方法可以使用下面的结果项在第二个命令中提供 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 }}"
答案 0 :(得分:18)
答案 1 :(得分:0)
在撰写本文时,此问题和已接受的答案非常有用。但是,我想对当前首选方式进行说明。
https://docs.ansible.com/ansible/latest/user_guide/playbooks_loops.html#migrating-to-loop
随着Ansible 2.5的发布,建议执行循环的方法是使用new循环关键字而不是with_X样式循环。
我已经看到这种文件循环组合会演变出这种常见模式。
- name: "Find python files in folder scripts"
find:
paths: "{{ playbook_dir }}/scripts"
patterns: "*.py"
file_type: "file"
register: python_files
- name: "Execute those python scripts from the script folder"
shell: "python {{ item.path | basename }}"
args:
chdir: "{{ playbook_dir }}/scripts"
loop: "{{ python_files.files }}"
loop_control:
label: "{{ item.path | basename }}"
这会循环遍历目录中的某些类型的文件(python文件),并对其文件名执行某些操作(执行它们),并且使用文件名是合理的,因为chdir
会将您放在这些文件所在的目录中文件。
在loop_control
中使用相同的文件名很重要,因为否则它将打印item
,这不是 just 的绝对路径,而是其他十几个文件属性完全不可读。
这可行,但首先也忽略了将loop
更改为Ansible的动机。这也可以用1代替2个任务:
- name: "Execute python scripts from the script folder"
shell: "python {{ item | basename }}"
args:
chdir: "{{ playbook_dir }}/scripts"
with_fileglob: "{{ playbook_dir }}/scripts/*.py"
loop_control:
label: "{{ item | basename }}"
在此循环中,item
是绝对路径。您可能希望将其打印出来,这样会完全失去loop_control
。
答案 2 :(得分:-1)
您需要从文件路径中提取文件名,变得非常容易。在您的情况下: {{find_result.path | basename}}