能否在Ansible network模块的provider中配置多主机?
如何用Ansible的ios_config模块实现多主机配置迭代
嘿,这个需求当然可以实现!不过你之前的思路踩了个小坑——ios_config模块的provider参数里的host字段不支持直接传入列表,这就是你尝试失败的原因。咱们换个更贴合Ansible设计思路的方式来搞定:
最佳实践:用Inventory管理主机(推荐)
Ansible的核心就是管理多主机,所以最规范的做法是把你的IOS设备放到**主机清单(Inventory)**里,而不是在localhost的变量里硬塞IP列表。
1. 编写Inventory文件
比如创建一个hosts.ini文件:
# 定义你的设备组 [my_group] 192.168.1.222 192.168.1.200 # 给组里的设备统一配置连接参数 [my_group:vars] ansible_user=admin ansible_password=PASS1 ansible_become=yes ansible_become_password=PASS2 ansible_connection=network_cli ansible_network_os=ios
这里的参数解释:
ansible_connection=network_cli:告诉Ansible用网络CLI方式连接IOS设备ansible_network_os=ios:指定设备操作系统为IOS,让Ansible自动适配模块- 其他参数对应你原来provider里的用户名、密码、提权信息
2. 编写Playbook
直接针对my_group组执行任务,Ansible会自动迭代每台设备:
- hosts: my_group gather_facts: no # 网络设备不需要收集系统facts,加快执行速度 tasks: - name: 配置NTP日志和源接口 ios_config: lines: - ntp logging - ntp source Vlan900
这样运行Playbook时,Ansible会依次连接my_group里的每台设备,执行NTP配置。
备选方案:手动循环主机列表
如果你确实需要在localhost的Playbook里手动控制主机列表,也可以用loop(或旧版with_items)来逐台生成provider配置:
- hosts: localhost gather_facts: no vars: # 可以直接写死列表,或者引用inventory里的组 target_hosts: "{{ groups['my_group'] }}" # 前提是inventory里有my_group组 cli_base: username: admin password: PASS1 authorize: yes auth_pass: PASS2 tasks: - name: 逐台配置IOS设备 ios_config: lines: - ntp logging - ntp source Vlan900 provider: "{{ cli_base | combine({'host': item}) }}" loop: "{{ target_hosts }}"
这里用combine过滤器把每一个主机IP和基础的provider参数合并,生成针对单台设备的provider配置,再通过loop遍历执行。
为什么你之前的方法不行?
再明确一下:ios_config模块的provider.host参数只接受单个字符串(单台设备的IP/主机名),不能直接传入列表。所以你把列表塞进去的话,模块无法识别,自然执行失败。
内容的提问来源于stack exchange,提问作者MMT
相关产品推荐
相关产品推荐

