You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于动态主机的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 14:57:33