从ansible文件结果中提取文件名

时间:2017-08-08 09:43:28

标签: regex jenkins ansible

我试图使用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 }}"

3 个答案:

答案 0 :(得分:18)

basename filter

{{ item.path | basename }}

还有dirnamerealpathrelpath过滤器。

答案 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}}