我正在使用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"
我需要将整个文件夹的内容从源复制到目标,包括子文件夹和文件吗?我该怎么做才能解决此问题,以实现这一目标?
答案 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的包装器。”
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