您的位置:首页 > 其它

配置核查模块 开发总结 (1)

2015-07-27 11:26 411 查看
到最后终于在deadline之前将开发工作进行完了。虽然遇到一些坑但是过程还算顺利,从两个月前的预研,设计,到最后的开发,算是大姑娘上轿头一回,独立的完成了软件开发周期的这三个过程。

以下记录一些在开发过程中遇到的问题以及解决办法:

在实现上遇到的一些问题:

配置核查,顾名思义,是要对配置信息进行核查。所以首先要拿到目标主机的配置信息,如此就必须与远程主机进行通信,一开始选择了两种通信方式:telnet和SSH,后来考虑的安全性,还是选择了SSH。
这样摆在面前的问题是怎么样去实现SSH通信模块?
人生苦短我用python,python中提供了paramiko模块用来创建SSH对象可以与目标主机进行通信,

paramiko

使用如下方法获取对象:

defgetMyssh(ip,userName,passWord,Mytimeout=5):
try:
ssh=paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(ip,22,userName,passWord,timeout=5)
except:
traceback.print_exc()
raise
returnssh

接着使用获取的ssh,与目标主机进行交互

myssh=getssh(ip,sshuser,sshpass,port)
stdin,stdout,stderr=myssh.exec_command("cat/etc/mysql/my.cnf")
out=stdout.readlines()


关于python自定义模块的一些问题:

Package(包)Import

包(Package)可以看成模块的集合,只要一个文件夹下面有个__init__.py文件,那么这个文件夹就可以看做是一个包。包下面的文件夹还可以成为包(子包)。更进一步,多个较小的包可以聚合成一个较大的包,通过包这种结构,方便了类的管理和维护,也方便了用户的使用。比如SQLAlchemy等都是以包的形式发布给用户的。
包和模块其实是很类似的东西,如果查看包的类型importSQLAlchemytype(SQLAlchemy),可以看到其实也是<type'module'>。import包的时候查找的路径也是sys.path。
包导入的过程和模块的基本一致,只是导入包的时候会执行此包目录下的__init__.py而不是模块里面的语句了。另外,如果只是单纯的导入包,而包的__init__.py中又没有明确的其他初始化操作,那么此包下面的模块是不会自动导入的。如:
PA
--__init__.py
--wave.py
--PB1
--__init__.py
--pb1_m.py
--PB2
--__init__.py
--pb2_m.py
__init__.py都为空,如果有以下程序:


importsys
importPA.wave#1
importPA.PB1#2
importPA.PB1.pb1_masm1#3
importPA.PB2.pb2_m#4
PA.wave.getName()#5
m1.getName()#6
PA.PB2.pb2_m.getName()#7

当执行#1后,sys.modules会同时存在PA、PA.wave两个模块,此时可以调用PA.wave的任何类或函数了。但不能调用PA.PB1(2)下的任何模块。当前Local中有了PA名字。
当执行#2后,只是将PA.PB1载入内存,sys.modules中会有PA、PA.wave、PA.PB1三个模块,但是PA.PB1下的任何模块都没有自动载入内存,此时如果直接执行PA.PB1.pb1_m.getName()则会出错,因为PA.PB1中并没有pb1_m。当前Local中还是只有PA名字,并没有PA.PB1名字。
当执行#3后,会将PA.PB1下的pb1_m载入内存,sys.modules中会有PA、PA.wave、PA.PB1、PA.PB1.pb1_m四个模块,此时可以执行PA.PB1.pb1_m.getName()了。由于使用了as,当前Local中除了PA名字,另外添加了m1作为PA.PB1.pb1_m的别名。
当执行#4后,会将PA.PB2、PA.PB2.pb2_m载入内存,sys.modules中会有PA、PA.wave、PA.PB1、PA.PB1.pb1_m、PA.PB2、PA.PB2.pb2_m六个模块。当前Local中还是只有PA、m1。
下面的#5,#6,#7都是可以正确运行的。
注意的是:如果PA.PB2.pb2_m想导入PA.PB1.pb1_m、PA.wave是可以直接成功的。最好是采用明确的导入路径,对于./..相对导入路径还是不推荐用。

可参考内容:

http://blog.csdn.net/hyholine/article/details/8581740

Linux公社网站(www.linuxidc.com)原文链接:http://www.linuxidc.com/Linux/2011-07/38078.htm
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: