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

Ansible 将文件夹(包括子文件夹)的全部内容复制到目标,ansible,Ansible,我正在使用ansible将.js文件从本地计算机移动到ec2开发环境,在复制整个文件夹结构时遇到问题 我正在使用以下任务移动文件,并且似乎遇到了一个问题,即仅复制直接位于dist文件夹中的文件。我需要将整个文件夹(包括子文件和文件夹)复制到目标文件夹 - name: Copy each file over that matches the given pattern copy: src: "{{ item }}" dest: "/home/admin/micros

我正在使用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"

我需要将整个文件夹内容从源复制到目标,包括子文件夹和文件?如何修复此任务以实现此目标?

首先在此处使用复制模块不太理想,因为“复制模块递归复制功能无法扩展到大量(>数百)文件。有关替代方法,请参阅
同步
模块,它是rsync的包装器。”

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

   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 "
如果要保留目录布局,可以按如下操作:

  synchronize:
        src: "{{ item }}"
        dest: /home/admin/microservice/dist
   with_lines: "find /home/admin/microservice/dist -type f -name *.js "
在Step1=>中,您将把父目录结构中必要的模式文件复制到临时目录中

Step2=>然后需要将临时目录复制到目标中。之后,您可以删除临时目录或任何您的用例

-name:将模式文件和目录复制到临时目录中
贝壳:找到-f类-名称“*.js”| cpio-pvdmB/temp/dir/
args:
chdir:“/Users/myfolder/webstoreprojects/project/microservice/dist/”
-名称:将临时目录递归复制到目标目录
副本:
src:“/temp/dir/”
dest:“/home/admin/microservice/dist/”
所有者:“管理员”
组:“管理员”
原力:“是”
模式:0755

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

  • 您无法在单个全局搜索操作中匹配目录和
    *.js
    文件

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

您需要分别处理目录和文件(请参阅中的实现)


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

在Ansible中执行此任务的
同步
任务:

- synchronize:
    src: /source/Users/myfolder/WebStormProjects/project/microservice/dist/
    dest: /home/admin/microservice/dist/
    rsync_opts:
      - --include=*/
      - --include=*.js
      - --exclude=*
注1:rsync\u opts中的过滤值不能加引号,这一点很重要


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

这也可以用于复制文件夹吗?在我的示例中,它仅将模式文件从源目录递归复制到目标目录。它不是目录结构。如果你想复制目录结构,你必须根据你的要求优化命令或剧本。我现在正在运行它。这很接近。我注意到它只是复制文件,而不是复制文件夹。关于如何使其同时复制文件夹,我还没有回答。我已编辑了关于“在保留父目录结构布局的同时如何执行”的回答。请检查
syncrononize
模块