Ansible:如何制作选择列表的子列表

时间:2018-12-12 09:58:51

标签: ansible

我有一个文件列表(具有完整路径)。 如何只选择与模式匹配的文件?

例如我有:

/tmp/test/a.txt
/tmp/test/b.txt
/tmp/test/c.log
/tmp/test/d.log
/tmp/test/e.txt

我只想获取以log结尾的文件

/tmp/test/c.log
/tmp/test/d.log

我认为我的列表不适用于您的示例

这是我的脚本及其输出

- name: List all files 
    debug:
      msg: "{{ item }}"
      verbosity: 3
    with_items: "{{ valid_logs_dir_files.stdout_lines }}"

将打印

changed: [localhost] => (item=/tmp/test/a.txt)
ok: [localhost] => (item=/tmp/test/b.txt)
ok: [localhost] => (item=/tmp/test/c.log)
ok: [localhost] => (item=/tmp/test/d.log)
ok: [localhost] => (item=/tmp/test/e.txt)

1 个答案:

答案 0 :(得分:1)

如果该列表来自远程文件系统的动态列表,则可以使用find,例如。

- name: Get file name based on pattern
  find:
     paths: /tmp/test
     patterns: "*.log"
  register: find_results

- name: Download files log files, just as example about using find_result
  fetch: src="{{ item['path'] }}" dest="myLocalDir"
  with_items: "{{ find_results['files'] }}"

有关详细信息,请参见find - Return a list of files based on specific criteria

要列出与本地计算机上的模式匹配的文件,请参阅fileglob

如果您的列表不是从文件系统动态获得的,但是已经完成,请使用matchsearch filter

- hosts: 127.0.0.1
  connection: local   
  vars:
     myFiles:
          - /tmp/test/a.txt
          - /tmp/test/b.txt
          - /tmp/test/c.log
          - /tmp/test/d.log
          - /tmp/test/e.txt

  tasks:
     - name: Filter list
       set_fact:
          new_list: "{{ myFiles | select('match','^/tmp/test/.*..log$') | list }}"

     - name: Show filtered list
       debug: msg="{{ item }}"
       with_items: "{{ new_list }}"

debug模块相应地替换file,以删除文件。