背景
减轻运维工程师的负担最好的方式就是自动化运维,可以将需求进行脚本转换,输出结果,再人为进行判断,能够实现更高效的工作和降低人为风险带来的故障几率,本次项目主要实现采用Python将用户需求编辑的excel转换为网络设备脚本命令。
环境
1、Python
2、Windows
3、Office
源码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import time
import xlrd
def demand():
book = xlrd.open_workbook("data.xlsx")
print("The number of worksheets is", book.nsheets)
txtFileName = '脚本.txt'
print(txtFileName)
file_object = open(txtFileName, 'w+')
file_object.write('<!-- ===== 脚本 ==== -->\n')
mSheet = book.sheet_by_name('策略参数填写表')
data_policy = book.sheet_by_name('策略表')
for rx in range(mSheet.nrows):
if rx == 0:
continue
flag = True
task_number = int(mSheet.row_values(rx)[0])
source_ip = mSheet.row_values(rx)[1]
local_ip = mSheet.row_values(rx)[2]
port = int(mSheet.row_values(rx)[3])
tcp_any_udp_any = mSheet.row_values(rx)[4]
comment = mSheet.row_values(rx)[5]
destination_ip = mSheet.row_values(rx)[6]
out_ip = mSheet.row_values(rx)[7]
for inspect in range(data_policy.nrows):
if destination_ip == data_policy.row_values(inspect)[3]:
print('该服务器IP已存在策略,无法创建')
flag = False
break
if not flag:
break
Outside_source=('/usr/local/bin/address add name "'+ str(source_ip)+'" ip ' + str(source_ip)+'/32 comment " ' + str(comment) + ' "\n\n')
file_object.write('/usr/local/bin/address add name "'+ str(local_ip)+'" ip '+ str(local_ip)+'/32 comment "' + str(comment) + ' "\n\n')
file_object.write(Outside_source.encode("gbk", 'ignore').decode("gbk", "ignore"))
file_object.write('/usr/local/bin/address add name "'+ str(out_ip)+'" ip '+ str(out_ip)+'/32 comment "' + str(comment) + ' "\n\n')
Outside_client=('fpctl add task type client id ' + str(task_number) + ' samenet yes sa ' + str(source_ip) + ' sport 1:65535 random off da ' + str(local_ip) + ' dport ' + str(port) + ' service ' + str(tcp_any_udp_any) + ' time none active on log on syn off udp off icmp off ping off l7proto "novalue" comment " ' + str(comment) + ' "\n\n')
file_object.write(Outside_client.encode("gbk", 'ignore').decode("gbk", "ignore"))
file_object.write('fpctl add task type server id ' + str(task_number) + ' sip ' + str(destination_ip) + ' sport ' + str(port) + ' inport 1:65535 eip ' + str(out_ip) + ' service ' + str(tcp_any_udp_any) + ' active on log off comment " ' + str(comment) + ' "\n\n')
file_object.close()
if __name__ == '__main__':
startTimes = time.time()
demand()
endTimes = time.time()
times = endTimes - startTimes
print('共耗时:' + repr(times) + '秒')
原理及挖坑过程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
python调用excel主要用到xlrd和xlwt这两个库,即xlrd是读excel,xlwt是写excel的库。
if __name__ == '__main__':的作用
一个python文件通常有两种使用方法:
第一是作为脚本直接执行;
第二是 import 到其他的 python 脚本中被调用(模块重用)执行。
因此 if __name__ == 'main': 的作用就是控制这两种情况执行代码的过程,在 if __name__ == 'main': 下的代码只有在第一种情况下(即文件作为脚本直接执行)才会被执行,而 import 到其他脚本中是不会被执行的。
str() 函数将对象转化为适于人阅读的形式。
坑示例:TypeError: can only concatenate str (not “float”) to str
原因:print()内的“+”前后数据类型保持一致
解决方法:print(str(1)+ str(2))
坑示例:Excel xlsx file; not supported
原因:xlrd2.0.1版本,只支持.xls文件。所以pandas.read_excel(‘xxx.xlsx’)会报错。
解决方法:
pip list #查看已经安装的第三方库
安装旧版xlrd,在cmd中运行:
pip uninstall xlrd
pip install xlrd==1.2.0
坑示例:'gbk' codec can't encode character '\xa0' in position 57: illegal multibyte
原因:windows打开文件默认是以“gbk“编码,识别unicode字符出现一些问题
解决方法:写入txt时增加“(content.encode("gbk", 'ignore').decode("gbk", "igno