最近在学习Python语言,想着通过一些实际应用来学习可以回事理解,所以想到批量配置管理企业内部的思科交换机。
python是一门解释性语言比较高级有很多的基础库和第三方开发库,现在开发环境也比较热门。
1. 怎么安装python环境这里就说了,这里是基于python2.7.5开发的,安装好python后还需要安装可以配置交换机基础库paramiko, 这个模块可以与很多类型的交换机连接。
安装方式:
1. 先安装pip,再安装paramiko库
curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
python get-pip.py
pip install paramiko
2. 安装好之后可以在项目里面通过import paramiko来引用这个库接口
#!/usr/bin/env python
import paramiko
3.通过项目实例来实现批量配置思科交换机:
先通过ciscolib库方式来配置交换机:这里是通过文件来管理交换机的IP地址。
# -*- coding: utf-8 -*-
import ciscolib
def main():
PASSWORD="wfweb2kd"
USERNAME="root"
ENABLE_PWD="c#andphp"
for ip in open('sw2960.txt').readlines():
ip = ip.strip()
if USERNAME != "":
switch = ciscolib.Device(ip, PASSWORD, USERNAME, ENABLE_PWD)
else:
switch = ciscolib.Device(ip, PASSWORD, enable_password=ENABLE_PWD)
try:
switch.connect()
print("Logged into %s,Successful" % ip)
except ciscolib.AuthenticationError as e:
print("Couldn't connect to %s: %s" % (ip, e.value))
continue
except Exception as e:
print("Couldn't connect to %s: %s" % (ip, str(e)))
continue
switch.enable(ENABLE_PWD)
switch.cmd("clock set 18:42:30 22 Apr 2019")
switch.cmd("conf t")
switch.cmd("service password-encryption")
switch.cmd("username admin secret admin123") #//这里只是测试,实际环境不要这样
switch.cmd("line vty 0 4")
switch.cmd("login local")
switch.cmd("crypto key generate rsa")
switch.cmd("\n")
#//这里只是测试最好是一条一条测试好了再上批量,这里踩了一个坑。
switch.cmd("end")
switch.cmd("wri mem")
switch.disconnect()
if __name__ == '__main__':
main()
4.配置成功之后可以通过ssh方式来连接配置,上面配置目的是启动交换机的 ssh加密连接22,但是这里也要注意有些交换机是没有ssh模块的也就是没有的。
[sw2960#]crypto key generate rsa
5.配置ssh来配置交换机:
#!/usr/bin/env python
import paramiko
import time
import getpass
import sys
import socket
username = raw_input("用户名:")
password = getpass.getpass("密码:")
ip_file = sys.argv[1]
cmd_file = sys.argv[2]
switch_with_authentication_issue = []
switch_not_reachable = []
f = open(ip_file,'r')
for line in f.readlines():
try:
ip = line.strip()
ssh_client = paramiko.SSHClient()
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh_client.connect(hostname=ip,username=username,password=password,look_for_keys=False)
print "你已经成功连接到: ", ip
command = ssh_client.invoke_shell()
cmdlist = open(cmd_file,'r')
cmdlist.seek(0)
for line in cmdlist.readlines():
command.send(line + "\n")
time.sleep(2)
cmdlist.close()
output = command.recv(65535)
print output
except paramiko.ssh_exception.AuthenticationException:
print "用户认证失败的" + ip + "."
switch_with_authentication_issue.append(ip)
except socket.error:
print ip + "不可达,请检查网络."
switch_not_reachable.append(ip)
f.close()
ssh_client.close
print '\n 以下交换机认证失败:'
for i in switch_with_authentication_issue:
print i
print '\n 以下交换机网络不可达:'
for i in switch_not_reachable:
print i
下面贴出来,IP文件和命令文件写法:
执行结果 :