使用Ansible Synchronize模块在远程CentOS-7主机复制文件的问题
刚好我之前也处理过类似的需求,给你几个靠谱的解决方案,帮你实现远程主机内部的文件/目录复制:
首先先确认下你的inventory配置没问题,centos-server的参数设置是符合要求的,接下来看具体实现方式:
方法1:用synchronize模块(推荐,适合复杂场景)
你说的没错,copy模块确实只能从本地推送到远程,而synchronize模块基于rsync,不仅能跨主机同步,还能通过任务委派实现远程主机内部的复制。
下面是完整的Playbook示例:
- name: 远程主机内部文件/目录复制任务 hosts: centos-server tasks: # 先确保远程主机安装了rsync(CentOS7默认有,保险起见加这步) - name: 安装rsync(若未安装) yum: name: rsync state: present # 创建目标目录(如果目标路径不存在的话) - name: 创建目标目录 file: path: /opt/target_dir/ state: directory mode: '0755' # 核心:远程主机内部同步文件/目录 - name: 同步远程主机内的文件/目录 ansible.posix.synchronize: src: /opt/source_file_or_dir/ dest: /opt/target_dir/ delegate_to: "{{ inventory_hostname }}"
关键说明:
delegate_to: "{{ inventory_hostname }}":把这个任务委派到远程主机本身执行,这样src和dest都是远程主机上的路径,rsync就会在远程主机内部完成复制- src末尾的斜杠:如果src是目录,加斜杠会把目录内的内容同步到dest;不加斜杠会把整个源目录同步到dest下(和rsync原生行为一致)
- 这个方法支持增量同步、权限保留、递归复制目录,适合复杂的复制场景
方法2:用command/shell模块(简单场景快速实现)
如果只是复制单个文件,或者需求很简单,直接用cp命令更省事:
- name: 远程主机内部单个文件复制 hosts: centos-server tasks: # 先确保目标目录存在 - name: 创建目标目录 file: path: /opt/target_dir/ state: directory mode: '0755' - name: 执行cp命令复制文件 command: cp /opt/source_file.txt /opt/target_dir/source_file.txt
这个方法更直接,但注意如果是复制目录需要加-r参数(cp -r /source_dir /dest_dir),而且没有增量同步的功能,适合简单场景。
小提示
- 如果你需要复制后修改文件权限,可以在复制完成后用
file模块调整 - 测试的时候可以加上
--check参数先模拟执行,确认没问题再正式运行
内容的提问来源于stack exchange,提问作者hypersonics
相关产品推荐
相关产品推荐

