为什么Netmiko不使用运行时动态赋值的hostname IP地址建立连接
问题根因
你动态赋值时操作的是task.host的自定义数据字典(即通过[]访问的用户自定义变量存储区),而nornir_netmiko插件建立连接时读取的是Host对象内置的hostname属性,二者存储位置完全独立。你打印输出的是存放在自定义字典里的值,插件根本无法读取,自然还是使用清单中初始化的空值,抛出"ip或host必须设置"的错误。
另外如果在赋值前已经触发过Netmiko连接初始化,Nornir会缓存旧的连接参数,即使后续修改了内置属性也可能沿用旧值。
可行解决方法(无需修改主机清单文件)
- 方法1:直接修改Host对象内置的hostname属性
把你赋值的代码改成直接修改内置属性,确保在调用任何Netmiko相关任务前执行即可:# 错误写法:写入自定义数据字典 # task.host['hostname'] = get_aws_public_ip(xxx) # 正确写法:修改内置hostname属性 task.host.hostname = get_aws_public_ip(str(task.host), task.host['aws_region']) - 方法2:手动清除连接缓存(适配已提前触发过连接初始化的场景)
修改完hostname后先关闭可能存在的旧连接缓存,再执行配置任务:task.host.hostname = get_aws_public_ip(str(task.host), task.host['aws_region']) # 清除旧的Netmiko连接缓存,强制用新参数建立连接 task.host.close_connection("netmiko") result = task.run( task=netmiko_send_config, config_file="templates/simple.j2" ) - 方法3:直接给任务传递连接参数(无需修改Host属性)
调用netmiko_send_config时直接传入hostname参数,优先级高于Host属性读取,无需修改Host对象本身:aws_public_ip = get_aws_public_ip(str(task.host), task.host['aws_region']) result = task.run( task=netmiko_send_config, config_file="templates/simple.j2", hostname=aws_public_ip )
内容的提问来源于stack exchange,提问作者Shepardos
相关产品推荐
相关产品推荐

