唯一标识问题
由于ip有可能会重复,这里使用salt-minion_id作为对应服务的唯一标识来对应的每一客户端机器。
面向对象python2-3的区别
Python2 中class Foo()是经典类,class Foo(object)是新式类
Python3中class Foo()/class Foo(object)都是新式类
经典类在继承上是深度优先 ,新式类在继承上是C3算法,特点情况下是广度优先
importlib反射代码讲解
反射:字符串映射到类中的对应方法,常用方法有getattr,hasattr,setattr
目录路径
![16c523468e2eaf1e20886de4b565d49967a.jpg](https://oscimg.oschina.net/oscnet/16c523468e2eaf1e20886de4b565d49967a.jpg)
disk.py
#!/usr/bin/env python
# coding:utf-8
class Disk(object):
pass
def run(self):
print("disk...run")
cup.py
#!/usr/bin/env python
# coding:utf-8
class Cpu(object):
pass
def run(self):
print("cpu...run")
mem.py
#!/usr/bin/env python
# coding:utf-8
class Mem(object):
pass
def run(self):
print("men...run")
demo1.py
#!/usr/bin/env python
# coding:utf-8
import importlib
import os,sys
Host_func_dic = {
'disk':'func_demo.hosts.disk.Disk',
'mem':'func_demo.hosts.mem.Mem',
'cpu':'func_demo.hosts.cpu.Cpu',
}
#host_li=['cpu','mem','ip']
for host in Host_func_dic.keys():
path=Host_func_dic.get(host) #拿到'func_demo.hosts.disk.Disk'
module_path,class_name = path.rsplit('.',maxsplit=1) #module_path=func_demo.hosts.disk class_name=Disk
module = importlib.import_module(module_path) #等于from func_demo.hosts import disk 并且module=disk
disk_class=getattr(module,class_name) #disk_class=getattr(disk,'Disk') 找到disk.py下的Disk类
JG=disk_class() #Disk() 实例化对象
JG.run() #执行类中的方法
disk...run
men...run
cpu...run
可以通过脚本定义好的key值来执行对应路径下的类的方法