cmdb之唯一标识及importlib反射

唯一标识问题

使用 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
2
class Foo():    --> 经典类
class Foo(objecy): --> 新式类

经典类和新式类的区别

  1. 继承时经典类为深度优先,新式类使用 C3 算法,满足一定条件下为广度优先

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    class 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 方法
  2. 类型的区别

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class 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
18
import 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()

用于批量执行通用的类,客户端获取服务器信息时使用

Recommended Posts