将文件夹(包括子文件夹)的全部内容复制到目标位置

时间:2018-07-11 22:21:49

标签: ansible

我正在使用ansible将.js文件从本地计算机移至ec2开发环境,并且在复制整个文件夹结构时遇到问题。

我正在使用以下任务来移动文件,并且似乎遇到了一个问题,即仅直接复制dist文件夹中的文件被复制。我需要将整个文件夹(包括子文件和文件夹)复制到目标文件夹。

- name: Copy each file over that matches the given pattern
    copy:
      src: "{{ item }}"
      dest: "/home/admin/microservice/dist"
      owner: "admin"
      group: "admin"
      force: "yes"
      recurse: "true"
      mode: 0755
    with_fileglob:
      - "/Users/myfolder/WebStormProjects/project/microservice/dist/*.js"

我需要将整个文件夹的内容从源复制到目标,包括子文件夹和文件吗?我该怎么做才能解决此问题,以实现这一目标?

2 个答案:

答案 0 :(得分:1)

使用copy模块,解决问题的方法将比您想象的要复杂得多,因为:

  • 您无法在一次全局操作中匹配目录和*.js文件,

  • 即使可以,也不能使用相同的“复制”操作来复制文件以及创建目录(注意:创建目录,而不是复制!因为后者暗示着使用所有文件)。

您需要分别处理目录和文件(请参见first revision of this answer中的实现)。


使用rsync,解决方案更加简洁,只需设置适当的过滤器--include='*/' --include='*.js' --exclude='*'

在Ansible中实现此任务的synchronize任务:

- synchronize:
    src: /source/Users/myfolder/WebStormProjects/project/microservice/dist/
    dest: /home/admin/microservice/dist/
    rsync_opts:
      - --include=*/
      - --include=*.js
      - --exclude=*

注1:重要的是不要在rsync_opts中为过滤后的值添加引号。

注意2:您可能仍需要设置适当的所有权和权限。

答案 1 :(得分:0)

首先使用复制模块不是理想的选择,因为“复制模块递归复制工具无法扩展到很多文件(>数百个)。有关替代方法,请参见synchronize模块,它是rsync的包装器。”

copy module documentation

synchonize module documentation

但是您可以使用复制模块执行以下操作:

   copy:
       src: "{{ item }}"
       dest: /home/admin/microservice/dist
   with_lines: "find /home/admin/microservice/dist -type f -name *.js "

类似地,您可以尝试使用“同步”模块,如下所示:

  synchronize:
        src: "{{ item }}"
        dest: /home/admin/microservice/dist
   with_lines: "find /home/admin/microservice/dist -type f -name *.js "

如果要保留目录布局,可以按以下步骤进行:

在Step1 =>中,您将父目录结构中的必要模式文件复制到临时目录中。

Step2 =>然后,您需要将temp目录复制到目标位置。病房结束后,您可以删除temp目录或任何用例。

- name: copy pattern files and directory into a temp directory shell: find . -type f -name "*.js" | cpio -pvdmB /temp/dir/ args: chdir: "/Users/myfolder/WebStormProjects/project/microservice/dist/" - name: Copy the temp directory recursively to destination directory copy: src: "/temp/dir/" dest: "/home/admin/microservice/dist/" owner: "admin" group: "admin" force: "yes" mode: 0755