如何在Ansible中的“ when”语句中使用通配符?

时间:2019-04-16 11:28:18

标签: json ansible

我有一个已创建的角色,可以将文件从服务器传输到服务器。问题是我只想发送以“ * tar.gz”结尾的特定文件。 现在,我的角色是传输每个包含“ tar.gz”表达式的文件。 (例如,我不需要的tar.gz.md5)。

如何创建通配符,以便仅发送以* tar.gz结尾的文件?我也想拥有包含一些单词的文件(如package),并以tar.gz结尾:file_package-1.tar.gz 我不需要文件:file_package-1.txt,file_package-2.pdf等。

我正在使用一个json文件,其中包含有关文件的元数据列表,最重要的是它具有文件的路径。 所以我正在搜索“路径”值中的json文件:

  {
    "uid": 1009,
    "woth": false,
    "mtime": 1555410625.083113,
    "inode": 134219554,
    "isgid": false,
    "size": 1717899,
    "roth": false,
    "isuid": false,
    "isreg": true,
    "pw_name": "ansible",
    "gid": 1009,
    "ischr": false,
    "wusr": true,
    "xoth": false,
    "rusr": true,
    "nlink": 1,
    "issock": false,
    "rgrp": true,
    "gr_name": "ansible",
    "path": "/app/deploy/package_1-201810221543.tar.gz",
    "xusr": false,
    "atime": 1555410625.076113,
    "isdir": false,
    "ctime": 1555410625.083113,
    "isblk": false,
    "xgrp": false,
    "dev": 64775,
    "wgrp": false,
    "isfifo": false,
    "mode": "0640",
    "islnk": false
  },
 {
    "uid": 1009,
    "woth": false,
    "mtime": 1555410625.083113,
    "inode": 134219558,
    "isgid": false,
    "size": 79,
    "roth": false,
    "isuid": false,
    "isreg": true,
    "pw_name": "ansible",
    "gid": 1009,
    "ischr": false,
    "wusr": true,
    "xoth": false,
    "rusr": true,
    "nlink": 1,
    "issock": false,
    "rgrp": true,
    "gr_name": "ansible",
    "path": "/app/deploy/package_1-201810221543.tar.gz.md5",
    "xusr": false,
    "atime": 1555410625.083113,
    "isdir": false,
    "ctime": 1555410625.083113,
    "isblk": false,
    "xgrp": false,
    "dev": 64775,
    "wgrp": false,
    "isfifo": false,
    "mode": "0640",
    "islnk": false
  },

在when语句找不到任何东西时使用* .tar.gz

  when: "*tar.gz' in item.path"

这是我的角色:

- name: COPY FILE tar.gz
  copy:
    src: "{{ item.path }}"
    dest: "{{ HOME_PATH }}/DEPLOY/"
  with_items:
    - "{{ files }}"
  when: "tar.gz' in item.path"

对于任何建议将不胜感激

2 个答案:

答案 0 :(得分:1)

  1. 首先使用find根据特定的shell / regex模式过滤文件
- name: FIND all tar.gz files
  find:
    paths: "[source-files-directory]"
    patterns: "[shell-or-regex-pattern]"
    use_regex: True
  register: files_to_copy

访问此页面以获取更多详细信息:https://docs.ansible.com/ansible/2.3/find_module.html

  1. 在文件名模式不使用copy的情况下使用when
- name: COPY FILE tar.gz
  copy:
    src: "{{ item.path }}"
    dest: "{{ HOME_PATH }}/DEPLOY/"
  with_items:
    - "{{ files_to_copy }}"

答案 1 :(得分:0)

我想说的是,使用shell,类似的事情应该起作用

- name: Copy tar.gz
  shell: cp -r *.tar.gz {{ HOME_PATH }}/DEPLOY/
  args:
    chdir: "{{ item.path }}