基于Linux服务器的python脚本实现局域网交换机运维①

一、环境搭建

win11宿主机,VMWare,Ubuntu虚拟机,ENSP仿真平台,mobaXterm。

网络环境配置

首先要完成linux虚拟机的网络配置,如图:

虚机选择NAT模式

然后通过mobaXterm(没有的话直接使用Ubuntu内部的终端)键入命令查看虚机的ip地址,ping外网测试网络连通性。

ifconfig #查看ip地址
ping www.baidu.com #测试网络连通性

测试结果:

可以看到,我的虚机IP地址为192.168.179.149/24,网关为192.168.179.255,连通性测试没有问题,这说明我们的虚拟机已经成功获取到了可进行有效通信的IP地址,读者也可自行进行虚机与宿主机的连通性测试,此处略。接下来进行ensp仿真平台的拓扑搭建。

拓扑图:

Cloud*1,二层SW*1,三层SW*3

连线之后等待各设备的端口亮起绿灯即可进行下一步配置,如果一直停留在红灯请读者自行重启设备或检查故障。

云是用于连接虚机(LinuxServer)与ENSP中各设备连接的,在实际生产中Server一般部署于内网DMZ区域,经由防火墙与各交换机/路由器进行SSH连接,在模拟实验中我们简化场景为LinuxServer直接接入同一个二层网络之中的三台交换机,省去了路由配置。(因此我们三台交换机需配置在与虚机相同的网段下,后续会介绍详细配置)

注意要选择与虚机相对应的网卡,否则虚机无法连接到环境中

交换机配置VLAN以及IP地址。

SW1192.18.179.11/24
SW2192.168.179.12/24

SW3

192.168.179.13/24

#三层交换机的配置,以SW1举例,读者可以自行修改VLAN号以及交换机名称,IP地址需保持与虚机在同一网段
<Huawei>un ter mon #关闭日志弹出
Info: Current terminal monitor is off.
<Huawei>sy #进入系统视图
Enter system view, return user view with Ctrl+Z.
[Huawei]vl 179 #创建VLAN
[Huawei-vlan179]int vl 179 #进入VLAN接口
[Huawei-Vlanif179]ip add 192.168.179.11 24 #配置IP地址
[Huawei-Vlanif179]int g0/0/1 #进入对应端口
[Huawei-GigabitEthernet0/0/1]po li a #设置端口为Access
[Huawei-GigabitEthernet0/0/1]po de vl 179 #放行VLAN 179

除了三层交换机,二层交换机同样需要配置。

     

<Huawei>un ter mon
Info: Current terminal monitor is off.
<Huawei>sy
Enter system view, return user view with Ctrl+Z.
[Huawei]vl 179
[Huawei-vlan179]int e0/0/1
[Huawei-Ethernet0/0/1]po li a
[Huawei-Ethernet0/0/1]po de vl 179
[Huawei-Ethernet0/0/1]int e0/0/2
[Huawei-Ethernet0/0/2]po li a
[Huawei-Ethernet0/0/2]po de vl 179
[Huawei-Ethernet0/0/2]int e0/0/3
[Huawei-Ethernet0/0/3]po li a
[Huawei-Ethernet0/0/3]po de vl 179
[Huawei-Ethernet0/0/3]int e0/0/4
[Huawei-Ethernet0/0/4]po li a
[Huawei-Ethernet0/0/4]po de vl 179

配置完成后交换机互ping,虚机与各交换机ping测试。

[SW1]ping 192.168.179.12
  PING 192.168.179.12: 56  data bytes, press CTRL_C to break
    Reply from 192.168.179.12: bytes=56 Sequence=1 ttl=255 time=110 ms
    Reply from 192.168.179.12: bytes=56 Sequence=2 ttl=255 time=30 ms
    Reply from 192.168.179.12: bytes=56 Sequence=3 ttl=255 time=60 ms
    Reply from 192.168.179.12: bytes=56 Sequence=4 ttl=255 time=60 ms
    Reply from 192.168.179.12: bytes=56 Sequence=5 ttl=255 time=60 ms

  --- 192.168.179.12 ping statistics ---
    5 packet(s) transmitted
    5 packet(s) received
    0.00% packet loss
    round-trip min/avg/max = 30/64/110 ms

[SW1]ping 192.168.179.13
  PING 192.168.179.13: 56  data bytes, press CTRL_C to break
    Reply from 192.168.179.13: bytes=56 Sequence=1 ttl=255 time=40 ms
    Reply from 192.168.179.13: bytes=56 Sequence=2 ttl=255 time=60 ms
    Reply from 192.168.179.13: bytes=56 Sequence=3 ttl=255 time=60 ms
    Reply from 192.168.179.13: bytes=56 Sequence=4 ttl=255 time=70 ms
    Reply from 192.168.179.13: bytes=56 Sequence=5 ttl=255 time=60 ms

  --- 192.168.179.13 ping statistics ---
    5 packet(s) transmitted
    5 packet(s) received
    0.00% packet loss
    round-trip min/avg/max = 40/58/70 ms

网络可达性已满足,接下来进行SSH配置。

SSH配置

交换机

首先在三层交换机上需要开启SSH Server以及相应认证配置。(二层交换机无需)

userpython
passwd123
[SW1]aaa
[SW1-aaa]local-user python password ci 123
Info: Add a new user.
[SW1-aaa]local-user python pri le 15
[SW1-aaa]local-user python service-type ssh
[SW1]stelnet server en
Info: Succeeded in starting the Stelnet server.
[SW1]ssh authentication-type de pass
[SW1]user-interface vty 0 4
[SW1-ui-vty0-4]authentication-mode aaa
[SW1-ui-vty0-4]protocol inbound ssh

Linux Server

首先我们需要在Ubuntu中安装python组件

sudo apt update #更新软件源
sudo apt install python3 #仓库中下载python3
python3 --version #安装后检查版本信息,确认是否安装成功

python中支持SSH协议的库主要是paramiko库和netmiko库。netmiko在paramiko的基础上进一步升级,将更多函数简化,因此netmiko库更加方便快捷,但也是因为过于简单,所以不适合初学者学习。按照弈心老师(王印,《网络工程师的python之路》作者)的说法,netmiko与paramiko的关系就好比自动挡与手动挡,为了学习到更多经验,此后的实验都是基于paramiko库。

sudo apt install python3-paramiko #引入模块

安装完成后我们可以进入python3视图,键入命令查看是否引入成功。

docker@ubuntuD:~/Desktop$ python3
Python 3.12.3 (main, Feb  4 2025, 14:48:35) [GCC 13.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import paramiko
>>>

没有报错,模块引入成功。到了这一步,终于可以开始我们的python自动化运维之旅了。

python脚本

编写

如果说使用的是mobaXterm对虚机进行的连接,我们可以用Xterm的shell直接进行脚本编写,操作简单。如果使用的是Linux系统的bash,则需要进入vi/vim编译器,对初学者来说操作较复杂,但习惯之后也能快速上手。不管如何,直接上代码!

首先在当前路径下创建一个py文件

touch LAB0.py
import paramiko
import time

IP_pre = '192.168.179.'
usr = 'python'
passwd = '123'
commands = [
'un ter mon',
'sy',
'sysn sw_ssh',
'q',
'sa',
'y',
' ',
]

for IP_last in range(11,14):
  ip = IP_pre + str(IP_last)
  
  ssh_client = paramiko.SSHClient()
  ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
  ssh_client.connect(hostname=ip,username=usr,password=passwd)
  print(ip+' ssh connected !\n')
  
  cmd = ssh_client.invoke_shell()
  for command in commands:
    cmd.send(command + '\n')
    time.sleep(1)
  print(ip+' is set !\n')
  ssh_client.close()

print('All SWs set !\n')

代码解释:

import paramiko
import time

IP_pre = '192.168.179.'
usr = 'python'
passwd = '123'
commands = [
'un ter mon',
'sy',
'sysn sw_ssh',
'q',
'sa',
'y',
' ',
]

引入paramiko模块用于建立SSH连接,引入time模块用于设定sleep时间(配置写入交换机时是同时写入,要给它一点时间反应)。随后是一个IP地址的前缀,用于拼接形成三个交换机的IP地址,设定用户名为python,密码123(与之前在交换机上进行的配置相同)。随后是指令列表,里面包含此次实验需要对交换机进行的配置命令行,功能为进入系统视图,修改交换机名称,保存退出。

for IP_last in range(11,14):
  ip = IP_pre + str(IP_last)

创建一个for循环,既可以用于建立三次连接对三个交换机进行操作,又可以用于拼接IP地址。

  ssh_client = paramiko.SSHClient()
  ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
  ssh_client.connect(hostname=ip,username=usr,password=passwd)
  print(ip+' ssh connected !\n')

调用paramiko库函数SSHClient()来拉起一个客户端(暂时这样理解)并赋值给ssh_client,后续的操作都需要经由ssh_client这个客户端。然后是设置公钥策略,set_missing_host_key_policy(paramiko.AutoAddPolicy()),这是用paramiko建立所有SSH连接必备的一步。默认情况下,paramiko会拒绝任何未知的SSH公钥,这里我们可以设置让paramiko接受来自SSH Server的公钥(三台开启服务的交换机)。做完这一步设置,建立连接以后其实我们可以到本地查看公钥,是可以看到三台交换机对应的PublicKey的,读者感兴趣可以自行操作。配置好公钥接收策略,我们就可以开启连接了。connect函数包含三个必要参数(hostname,username,password)对应服务端的IP地址,用户名以及密码,其他参数也是可以由读者自行探索。到这一步,SSH连接正式建立。

  cmd = ssh_client.invoke_shell()
  for command in commands:
    cmd.send(command + '\n')
    time.sleep(1)
  print(ip+' is set !\n')
  ssh_client.close()

invoke_shell()是用来拉起一个shell,也就是命令行,赋值给cmd后通过cmd.send()就可以向交换机发送命令了。然后就是将命令逐个写入交换机,需要注意的是:以前我们在写命令时,写一行要敲一个回车,这样才能把命令传入给机器,那么我们通过脚本怎样来敲回车呢?没错,就是‘\n’,因此我在每个command后都加上了一个换行符。这一点尤其重要!然后就是每输入一个命令,休息一秒,给交换机充分的反应时间(其实并不用每个命令都需要,也不用1s这么长,但就是想告诉大家在写脚本时不要忽略交换机本身的处理时间)。完成后在屏幕上输出提示信息,然后就可以关闭SSH连接了。当所有交换机都配置完毕,屏幕打印提示信息,脚本就执行完毕了。

运行

 

docker@ubuntuD:~/Desktop$ python3 LAB0.py
192.168.179.11 ssh connected !

192.168.179.11 is set !

192.168.179.12 ssh connected !

192.168.179.12 is set !

192.168.179.13 ssh connected !

192.168.179.13 is set !

All SWs set !

docker@ubuntuD:~/Desktop$

进入到交换机,可以看到名字确实修改成功了。

成功了。

杂谈

上学期上雷洪江老师的通信原理课程时,某次听到雷老师谈到王印老师(笔名弈心)的成名往事,才惊觉这位无数网络工程师心目中的偶像竟与我如此之近,然后本学期速速拜读《网络工程师的Python之路》,之后也才有了本人的这第一篇博客。强烈建议各位细读,大概一周就能读完,内容简单易懂,真的是市面上对于网工最友好、最有效的python教程!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值