Netmiko网络自动化工具使用指南

Netmiko网络自动化工具使用指南

netmiko Multi-vendor library to simplify Paramiko SSH connections to network devices netmiko 项目地址: https://gitcode.com/gh_mirrors/ne/netmiko

什么是Netmiko?

Netmiko是一个基于Python的多厂商网络设备SSH连接库,它简化了与各种网络设备的交互过程。作为网络自动化领域的重要工具,Netmiko支持包括Cisco IOS、Juniper JunOS、Arista EOS等在内的多种网络设备类型,为网络工程师提供了统一的API接口来管理异构网络环境。

基础连接示例

简单连接示例

from netmiko import ConnectHandler
from getpass import getpass

# 建立SSH连接
net_connect = ConnectHandler(
    device_type="cisco_ios",
    host="192.168.1.1",
    username="admin",
    password=getpass(),  # 安全地获取密码
)

# 获取设备提示符
print(net_connect.find_prompt())

# 断开连接
net_connect.disconnect()

这个基础示例展示了如何使用Netmiko连接Cisco IOS设备。getpass()函数可以安全地获取密码输入,避免在代码中明文存储密码。

使用字典参数连接

更优雅的方式是使用字典存储连接参数:

device = {
    "device_type": "cisco_ios",
    "host": "192.168.1.1",
    "username": "admin",
    "password": getpass(),
}

net_connect = ConnectHandler(**device)

上下文管理器连接

Python的上下文管理器可以自动处理连接的关闭:

with ConnectHandler(**device) as net_connect:
    print(net_connect.find_prompt())

这种方式无需手动调用disconnect(),代码更简洁且不易出错。

特权模式操作

对于需要进入特权模式的设备:

device = {
    "device_type": "cisco_ios",
    "host": "192.168.1.1",
    "username": "admin",
    "password": getpass(),
    "secret": getpass("Enable secret: "),  # 特权模式密码
}

net_connect = ConnectHandler(**device)
net_connect.enable()  # 进入特权模式
print(net_connect.find_prompt())  # 现在提示符应该是"#"

多设备管理

Netmiko可以轻松管理多台设备:

devices = [
    {"device_type": "cisco_ios", "host": "192.168.1.1"},
    {"device_type": "juniper_junos", "host": "192.168.1.2"},
    {"device_type": "arista_eos", "host": "192.168.1.3"}
]

for device in devices:
    device.update({
        "username": "admin",
        "password": getpass()
    })
    with ConnectHandler(**device) as conn:
        print(f"{device['host']} prompt: {conn.find_prompt()}")

命令执行与输出处理

基本命令执行

output = net_connect.send_command("show ip interface brief")
print(output)

结构化输出解析

Netmiko支持TextFSM和Genie等解析器,将命令输出转换为结构化数据:

# 使用TextFSM解析
output = net_connect.send_command("show ip int brief", use_textfsm=True)
# 输出将是字典列表,便于程序处理

# 使用Genie解析
output = net_connect.send_command("show ip int brief", use_genie=True)
# Genie提供了更丰富的结构化数据

配置变更

基本配置变更

commands = [
    "interface GigabitEthernet0/1",
    "description Configured by Netmiko",
    "no shutdown"
]

output = net_connect.send_config_set(commands)
output += net_connect.save_config()  # 保存配置

从文件加载配置

output = net_connect.send_config_from_file("config_changes.txt")
output += net_connect.save_config()

高级功能

处理交互式命令

对于需要交互的命令,可以使用send_command_timingexpect_string

# 基于时间的交互处理
output = net_connect.send_command_timing("delete flash:old_config.txt")
if "confirm" in output:
    output += net_connect.send_command_timing("y")

# 基于模式匹配的交互处理
output = net_connect.send_command(
    "delete flash:old_config.txt",
    expect_string=r"confirm"
)
output += net_connect.send_command("y", expect_string=r"#")

调整命令超时

对于耗时较长的命令,可以调整超时参数:

# 使用delay_factor增加超时
output = net_connect.send_command(
    "show tech-support",
    delay_factor=4  # 默认超时的4倍
)

# 全局调整超时
device = {
    "device_type": "cisco_ios",
    "global_delay_factor": 2,  # 所有命令超时翻倍
    # 其他参数...
}

安全连接选项

使用SSH密钥认证

device = {
    "device_type": "cisco_ios",
    "host": "192.168.1.1",
    "username": "admin",
    "use_keys": True,
    "key_file": "~/.ssh/id_rsa",
}

使用SSH配置文件

device = {
    "device_type": "cisco_ios",
    "host": "192.168.1.1",
    "ssh_config_file": "~/.ssh/config",
}

日志记录

Netmiko支持详细的日志记录,便于调试:

import logging

logging.basicConfig(filename="netmiko.log", level=logging.DEBUG)
logger = logging.getLogger("netmiko")

# 会话日志记录
device = {
    "device_type": "cisco_ios",
    "session_log": "session.log",
    # 其他参数...
}

文件传输

Netmiko支持SCP文件传输:

result = net_connect.send_command(
    "copy scp: flash:new_image.bin",
    expect_string=r"Address or name",
    strip_prompt=False,
    strip_command=False
)
result += net_connect.send_command(
    "192.168.1.100",
    expect_string=r"Username",
    strip_prompt=False,
    strip_command=False
)
result += net_connect.send_command(
    "scp_user",
    expect_string=r"Password",
    strip_prompt=False,
    strip_command=False
)
result += net_connect.send_command(
    "scp_password",
    expect_string=r"#",
    strip_prompt=False,
    strip_command=False
)

设备类型自动检测

Netmiko可以自动检测设备类型:

from netmiko import SSHDetect, Netmiko

device = {
    "host": "192.168.1.1",
    "username": "admin",
    "password": getpass(),
}

guesser = SSHDetect(**device)
best_match = guesser.autodetect()
print(f"Detected device type: {best_match}")

device["device_type"] = best_match
conn = Netmiko(**device)

最佳实践建议

  1. 错误处理:始终添加适当的异常处理
  2. 连接管理:优先使用上下文管理器
  3. 密码安全:避免在代码中硬编码密码
  4. 日志记录:生产环境应启用日志记录
  5. 性能考虑:对于大批量设备,考虑使用多线程

通过掌握Netmiko的这些功能,网络工程师可以大幅提升网络设备管理的效率和可靠性,为网络自动化奠定坚实基础。

netmiko Multi-vendor library to simplify Paramiko SSH connections to network devices netmiko 项目地址: https://gitcode.com/gh_mirrors/ne/netmiko

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

徐耘馨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值