Ansible跨节点文件复制报错排查:Level2到Level1同步问题解决
问题原因
delegate_to参数仅支持单个主机标识(主机名、IP或Inventory中的单主机条目),你传入的machine-010_lv2是组名,Ansible无法将组名解析为SSH连接目标,因此触发解析错误。- 额外隐含问题:即使指定单个Level2主机,还需确保Level2与对应Level1机器之间已建立SSH信任关系(免密登录)、网络连通,否则文件同步仍会失败。
解决方法
以下提供两种符合需求的实现方案,均实现Level2与Level1的点对点文件同步(不经过中控机):
方案1:让Level1主动拉取对应Level2的文件
遍历所有Level1机器,针对每个Level1关联的Level2组,让Level1机器从Level2拉取目标文件。
- name: 从Level2拉取CSV文件到对应Level1 hosts: level1_group # 替换为你的Level1机器所在的组名 tasks: - name: 同步Level2的CSV文件到当前Level1 ansible.posix.synchronize: src: "/path/to/remote/csv/file_machinelv1_{{ inventory_hostname }}_machinelv2_{{ item }}.csv" dest: "/path/on/level1/to/save/" mode: pull # pull模式表示从远程(Level2)拉到当前执行主机(Level1) loop: "{{ groups[inventory_hostname ~ '_lv2'] }}" # 获取当前Level1对应的Level2组内的所有主机 delegate_to: "{{ inventory_hostname }}" # 任务委托给当前Level1机器执行
方案2:让Level2主动推送文件到对应Level1
先给每个Level2主机在Inventory中添加自定义变量(如level1_parent),指定其对应的Level1主机名,然后遍历Level2机器,让它们把文件推送到对应的Level1。
第一步:修改Inventory配置
[level1_group] machine-010 machine-011 [machine-010_lv2] machine-010-01 level1_parent=machine-010 machine-010-02 level1_parent=machine-010 [machine-011_lv2] machine-011-01 level1_parent=machine-011
第二步:编写Ansible任务
- name: 从Level2推送CSV文件到对应Level1 hosts: all_lv2_groups # 替换为包含所有Level2组的父组,或直接写"machine-010_lv2,machine-011_lv2" tasks: - name: 推送CSV文件到关联的Level1机器 ansible.posix.synchronize: src: "/path/to/remote/csv/file_machinelv1_{{ level1_parent }}_machinelv2_{{ inventory_hostname }}.csv" dest: "{{ level1_parent }}:/path/on/level1/to/save/" delegate_to: "{{ inventory_hostname }}" # 任务委托给当前Level2机器执行
关键注意事项
- 确保Level1与对应Level2机器之间已配置SSH免密登录(可在Level1上执行
ssh-copy-id到Level2,或反向操作,取决于同步方向)。 - 同步路径需确保执行用户有读写权限。
- 如果Level2主机名的格式是
machine-010-01这类可拆分出Level1标识的,也可以不用Inventory变量,直接通过字符串截取获取Level1主机名(如inventory_hostname.split('-')[0] ~ '-' ~ inventory_hostname.split('-')[1])。
内容的提问来源于stack exchange,提问作者Tms91
相关产品推荐
相关产品推荐

