我正在使用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"
我需要将整个文件夹内容从源复制到目标,包括子文件夹和文件吗?我可以做些什么来修复此任务以实现此目标?
使用copy
模块,问题的解决方案将比您想象的要复杂得多,因为:
-
您无法在单个globbing操作((中匹配目录和
*.js
文件 -
即使可以,也不能使用相同的"复制"操作来复制文件和创建目录(注意:创建目录,而不是复制!因为后者意味着复制所有文件(。
您需要分别处理目录和文件(请参阅本答案第一次修订版中的实现(。
使用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:您可能仍然需要设置适当的所有权和权限
首先在这里使用复制模块应该不是理想的,因为"复制模块递归复制功能不会扩展到很多(>数百(个文件。有关替代方案,请参阅synchronize
模块,它是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 "
如果你想保留目录布局,你可以如下所述::
在步骤1=>您将把父目录结构中所需的模式文件复制到临时目录中。
Step2=>然后您需要将临时目录复制到目标中。病房之后,你可以删除临时目录或任何你的用例。
- 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