基于动态主机的Ansible子任务执行问题求助:SSH连接字典内主机执行任务失败
解决Ansible动态SSH连接多主机并执行配置的问题
看起来你遇到的核心问题是在include_tasks的文件里嵌套了play定义——你的worker.yml里写了hosts: "{{ item.device }}",但include_tasks是用来给当前play追加任务的,不能在里面定义新的play(hosts属于play级别的配置),这直接导致了你的配置无法正常工作。我给你两种可行的解决方案,你可以根据自己的场景选择:
方案一:动态添加主机(适合inventory未提前定义目标设备)
这种方法会先把JSON里的目标设备添加到临时主机组,再针对这个组执行配置任务,不需要提前在inventory里配置这些设备:
修改后的main.yml
--- # 第一步:在本地把目标设备添加到临时组,同时传递必要变量 - hosts: localhost gather_facts: no vars: - input: "{{ lookup('file','temp/yoda-xxx-xx.json') | from_json }}" - ansible_network_os: nokia.sros.classic - ansible_ssh_user: user - ansible_password: password tasks: - name: 将目标设备加入临时组并传递配置文件路径 add_host: name: "{{ item.device }}" groups: target_devices ansible_network_os: "{{ ansible_network_os }}" ansible_ssh_user: "{{ ansible_ssh_user }}" ansible_password: "{{ ansible_password }}" target_config_file: "{{ item.config_file }}" loop: "{{ input.delta_config }}" # 第二步:针对临时组里的所有设备执行配置 - hosts: target_devices connection: network_cli gather_facts: no tasks: - name: 执行设备配置 community.network.sros_config: src: "{{ target_config_file }}" save: yes match: line
方案二:基于现有inventory匹配执行(适合目标设备已在inventory中)
如果你的Ansible inventory里已经包含了yoda-yy-01、yoda-yy-02这些设备,可以用条件判断来匹配当前主机并获取对应的配置文件:
修改后的main.yml
--- - hosts: all connection: network_cli gather_facts: no vars: - input: "{{ lookup('file','temp/yoda-xxx-xx.json') | from_json }}" - ansible_network_os: nokia.sros.classic - ansible_ssh_user: user - ansible_password: password tasks: - name: 获取当前主机对应的配置文件路径 set_fact: current_config: "{{ item.config_file }}" loop: "{{ input.delta_config }}" when: item.device == inventory_hostname - name: 执行设备配置(仅当当前主机在目标列表中时运行) community.network.sros_config: src: "{{ current_config }}" save: yes match: line when: current_config is defined
关键技巧总结
- 不要在
include_tasks文件里写play:include_tasks是给当前play追加任务,只能包含task定义,不能有hosts、connection这类play级别的配置。 - 动态主机管理用
add_host:如果目标设备不在inventory里,add_host可以临时把它们加入主机组,还能直接传递每个设备的专属变量。 - 变量匹配要精准:用
inventory_hostname(当前执行任务的主机名)来匹配JSON里的设备名,确保每个主机拿到自己对应的配置文件。
内容的提问来源于stack exchange,提问作者burg
相关产品推荐
相关产品推荐

