jenkins 从Ansible中的文件结果中提取文件名

rnmwe5a2  于 2023-05-28  发布在  Jenkins
关注(0)|答案(3)|浏览(189)

我尝试使用Ansible find模块的结果,该模块返回在特定文件夹中找到的文件列表。
问题是,当我迭代结果时,我没有文件名,我只有它们的完整路径(包括名称)。
有没有一种简单的方法可以使用下面的find_resultitem 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 }}"
5jvtdoz2

5jvtdoz21#

basename过滤器?

{{ item.path | basename }}

还有dirnamerealpathrelpath滤波器。

hfwmuf9z

hfwmuf9z2#

这个问题和公认的答案是伟大的时间,他们写的。然而,我想留下一个关于 * 当前首选 * 的方法的说明。
https://docs.ansible.com/ansible/latest/user_guide/playbooks_loops.html#migrating-to-loop
随着Ansible 2.5的发布,执行循环的推荐方法是使用new loop关键字而不是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,这不仅仅是绝对路径,而是一打其他完全不可读的文件属性。
这是可行的,但它也忽略了loop更改Ansible的动机。这也可以工作,将2个任务替换为1:

- 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

mbjcgjjk

mbjcgjjk3#

你需要从文件路径中提取文件名,变得容易多了。在您的案例中:{{find_result.path|基本名称

相关问题