遇到问题:
通过ansible脚本从源服务器copy某个目录下的所有子目录和文件到目标服务器的目录,命令中的src和dest的目录路径最后结尾需不需要增加斜杠"/" ?
这种情况对应有下面四个命令:
ansible -i /etc/ansible/hosts hosts_1 -m copy -a "src=/opt/myproject/update_packages dest=/opt/update_packages"
ansible -i /etc/ansible/hosts hosts_1 -m copy -a "src=/opt/myproject/update_packages dest=/opt/update_packages/"
ansible -i /etc/ansible/hosts hosts_1 -m copy -a "src=/opt/myproject/update_packages/ dest=/opt/update_packages"
ansible -i /etc/ansible/hosts hosts_1 -m copy -a "src=/opt/myproject/update_packages/ dest=/opt/update_packages/"
实践结果:
ansible -i /etc/ansible/hosts hosts_1 -m copy -a "src=/opt/myproject/update_packages dest=/opt/update_packages"
ansible -i /etc/ansible/hosts hosts_1 -m copy -a "src=/opt/myproject/update_packages dest=/opt/update_packages/"
上面两个命令的结果一致:
目标服务器的/opt/update_packages创建了个子目录update_packages,将源服务器的update_packages做为一个整体copy到了目标服务器的目录下。
ansible -i /etc/ansible/hosts hosts_1 -m copy -a "src=/opt/myproject/update_packages/ dest=/opt/update_packages"
ansible -i /etc/ansible/hosts hosts_1 -m copy -a "src=/opt/myproject/update_packages/ dest=/opt/update_packages/"
上面两个命令的结果一致:
复制源服务器/opt/myproject/update_packages目录内的内容(不包括目录本身),然后将这些内容复制到目标服务器目录路径/opt/update_packages下
原理:
简化版理解:当 src 是目录且以斜杠结尾时,Ansible 复制的是目录内的内容;当 src 不以斜杠结尾时,Ansible 复制的是整个目录(包括其名称)。
ansible官方文档:
https://docs.ansible.com/ansible/latest/collections/ansible/builtin/copy_module.html
src:
如果路径是一个目录,则会递归复制它。在这种情况下,如果路径以“/”结尾,则仅复制该目录内的内容到目标位置。否则,如果路径不以“/”结尾,则会复制目录本身及其所有内容。这种行为类似于rsync命令行工具的行为。
dest:
如果源(src)是一个目录,目标(dest)也必须是一个目录。
如果目标(dest)是一个不存在的路径,并且目标(dest)以“/”结尾或者源(src)是一个目录,则会创建目标(dest)。
如果目标(dest)是一个相对路径,起始目录由远程主机确定。
如果源(src)和目标(dest)都是文件,目标(dest)的父目录不会被创建,并且如果父目录不存在,任务将失败。