唯一标识问题
使用 saltstack 得到的结果一般如下1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17[root@qqcloud ~]# salt * grains.get ip_interfaces
vultr-singap:
----------
eth0:
- 45.77.249.53
- fe80::5400:1ff:feda:5802
lo:
- 127.0.0.1
- ::1
vultr-newj:
----------
eth0:
- 209.222.21.90
- fe80::5400:1ff:feda:595e
lo:
- 127.0.0.1
- ::1
调用 salt-api 得到结果格式则如下1
{'vultr-singap': {'lo': ['127.0.0.1', '::1'], 'eth0': ['45.77.249.53', 'fe80::5400:1ff:feda:5802']}, 'vultr-newj': {'lo': ['127.0.0.1', '::1'], 'eth0': ['209.222.21.90', 'fe80::5400:1ff:feda:595e']}}
字典的 key 为 minion id, value 为字典,得到结果如何和服务器的 IP 地址对应关系呢?
此时就使用 minion id 作为唯一标识,因为 saltstack 要求 minion id 不能重复。
建议 minion id 从开始就不要变,如果要变更,需要停止对应的 saltstack 服务,删除接受的 keys,然后重启服务并进行 keys 认证。
python 2 和 3 面向对象的而区别
pyton2 中存在经典类和新式类 2 种
python3 中只有新式类
python2 定义类的时候不写 object 为经典类,写 object 为新式类
1
2class Foo(): --> 经典类
class Foo(objecy): --> 新式类
经典类和新式类的区别
继承时经典类为深度优先,新式类使用 C3 算法,满足一定条件下为广度优先
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16class D():
def run(self):
print('this D')
class D():
def run(self):
print('this D')
class B(D):
pass
class A(B, C):
pass
demo = A()
demo.run() -->经典类采用深度优先,调用 D 的 run 方法类型的区别
1
2
3
4
5
6
7
8
9
10class A(object):
pass
class B():
pass
a = A()
b = B()
print(type(a)) #--> (class '__main__.A')
print(type(b)) #--> (type 'instance')
反射
反射常用的有 getattr
hasattr
setattr
下面为使用 getattr 示例1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18import importlib
Host_func_dic = {
'disk': 'func.hosts.disk.Disk',
'mem': 'func.hosts.mem.Mem',
'cpu': 'func.hosts.cpu.Cpu',
'os': 'func.hosts.os.Os',
}
host_li = ['disk', 'cpu']
for host in host_li:
path = Host_func_dic.get(host)
module_path,class_name = path.rsplit('.', maxsplit=1)
module = importlib.import_module(module_path)
disk_class = getattr(module, class_name)
JG = disk_class()
JG.run()
用于批量执行通用的类,客户端获取服务器信息时使用