2020/04/22 04-消息模块设计和实现

在这里插入图片描述
有ssh的方式,paramiko库,自己写一个就是popen起一个子进程,也很方便,ssh也不是唯一选择

执行脚本是我们运维过程中经常遇到的事情,但是服务器多了,谁上去执行就需要一个角色审计,shell脚本运行的本质,无非就是bash下开启子进程,一条命令一条命令执行
在这里插入图片描述

选择有agent设计,只不过这个agent是个自己写的子进程,子进程里运行里面相关的命令得到相应的结果
在这里插入图片描述
这是用到一个Popen
在这里插入图片描述
最后得到一个执行器
在这里插入图片描述
可以写个说明。三引号加回车都有了,这就是怎么去写文档
在这里插入图片描述
别人就能理解是什么了
在这里插入图片描述
pipe会阻塞,比较危险,所以换成文件,采用临时文件方式
在这里插入图片描述
得到结果可以存储下来发送到服务器端,有异常也要通知master
在这里插入图片描述
可以看下超时怎么回事
在这里插入图片描述
**agent太多,master肯定需要管理,每个agent资源使用情况必须要清楚 **

在这里插入图片描述
一个调度系统,要知道每个agent资源使用情况,以及现在是否在运行
在这里插入图片描述
ping走的是icmp协议,不能测试web服务是否正常,所以ping解决不来应用程序的问题,ping只能确定这个ip是能够访问到的,但是有的ip是可以流动的,尤其高可用的情况下。

注册+心跳机制,注册agent汇报一些信息,如果最后一次签到时间是一小时之前的,agent就有可能挂了

可以在master里通过配置来指定agent,也可以主动让agent向master发送信息
在这里插入图片描述
master和agent采用cs编程,底层socket通信
在这里插入图片描述
agent需要向master发送两种信息,注册信息,和心跳信息;
1.链接建立以后立马向master发送注册信息,主要至少三样,我是谁,UUID,尤其是分布式解析的时候,域名主机名很重要,主机名并不敢保证是唯一的,这次生成一个UUID代表唯一值,来代表一台主机,(比较类似git,每生成一个版本有一个target),这个就类似uuid的概念,是一段不重复的编码,UUID才是i真正确定身份的。
很多情况下一台主机配置多个ip,一个对内一个对外,把所有接口上的所有ip给master,还有汇报的时间。配置多个集群服务端的时候时间必须一致,ntp,或者croni。
2.心跳信息也需要带上发送的时间,心跳包不宜过大,能带点数据就带数据,然后可以提取这样的信息。这种状态值就比较适合放在redis中

在这里插入图片描述
现在用json来表示
在这里插入图片描述
在这里插入图片描述
调用这个方法,直接取16进制表达
在这里插入图片描述
多生成几次
在这里插入图片描述

第二个值hostname,可以到socket模块里取一下,跨平台
在这里插入图片描述
IP地址,尤其做运维开发,需要读取网络接口,有一个库netifaces,直接安装
在这里插入图片描述
看一下interfaces

在这里插入图片描述
这是windows的接口名称

在这里插入图片描述
中括号可以遍历
在这里插入图片描述
用所有网络接口名称去看地址,这里一条条都是字典
在这里插入图片描述

这里就拿到了
在这里插入图片描述
用get方法,比较保险,因为有none

在这里插入图片描述
**2拿到之后是个列表,列表里有一堆ipv4
**
在这里插入图片描述
这样就拿到了,首先拿到所有网络接口,每个接口可以绑定多个ip地址,linux也一样
在这里插入图片描述
要判断一下,因为127.0.0.1是不要的,地址简单分为ABC,还有组播,还有保留,这里有个ipaddress模块,都帮你做好了

在这里插入图片描述
这点地址肯定不够,加一点
在这里插入图片描述
准备进行迭代,现在返回一个ipv4地址对象
在这里插入图片描述
可以询问是否全局global,是否回环loopback,是否保留的reserved,multicast多播地址,private私有,version版本
在这里插入图片描述
0.0.0.0是私有地址
在这里插入图片描述
这个网卡在windows下,没有分配dhcp的话,会给一个这么个值,这个值也不能要
在这里插入图片描述
公网的,私网的,非保留的,非组播的,非link_local的,非回环的都要
在这里插入图片描述
除这些以外的地址才保留下来

在这里插入图片描述
在这里插入图片描述
看一下0.0.0.0这个地址,属于一个私有地址
在这里插入图片描述
这样还在是因为类型不对,要加一下str
在这里插入图片描述
这样就搞定了

在这里插入图片描述
收集本地网卡是收集不到这个地址的
在这里插入图片描述
现在可以写一个message,对于一个消息,uuid最好只申明一次,这个消息是代表不同的agent,这个agent才拥有一个message对象,每个message对象应该标识消息是谁发的,agent这个值,应该保留一段时间。有先服务会生成一个id文件,只要你不删除就一直用这个id号来代表文件定位,所以这个id要持久化。
在这里插入图片描述
所以写一个固定位置,从文件读取,默认文件只读,一个agent应该是一个唯一id,一旦生成不可改变,除非删除myid文件
在这里插入图片描述
还需要健壮一下,文档的存在性也需要判断,还要看id是否合适

在这里插入图片描述
看一下长度
在这里插入图片描述
len(id)必须32位才能把id给你,判断文件是否存在,只能用import os一下
在这里插入图片描述
其实最应该写的os.path,导入os.path首先导入的是os。导完os就导入path,但是在python解释器进行启动的时候,os模块和os.path模块是默认加载的,下面直接用os.path没有问题,否则这个模块没人替你加载,最好的写法还是os.path
在这里插入图片描述
如果看了解释器进程一旦加载以后,sys.modules加载的东西,就什么都明白了。这些模块,什么时候加载要记住
在这里插入图片描述存在就读取,不存在就生成一下,这样之后,selfid就有值了,就可以开始用了
在这里插入图片描述
这样id问题就解决了

在这里插入图片描述
把socket加进来
在这里插入图片描述
加入时间戳,socket拿到主机名,剩下的就只有ips了
在这里插入图片描述
这里就抽出来一个内部函数,拿到地址,用的库太多了,一定要建立虚拟环境,否则用的环境都不一样

在这里插入图片描述
把之前的写的取ip函数,复制一下
在这里插入图片描述
拿到之后就拿到了所谓的ip
在这里插入图片描述
拿到ip判断一下类型

在这里插入图片描述
可以接在一起

在这里插入图片描述
现在这样就可以了

在这里插入图片描述
下面拿到ip就可以进行判断了
在这里插入图片描述
但是下面需要列表,所以不用yield,用return比较好,一定要str
在这里插入图片描述
这样即可

在这里插入图片描述
可以用一个包一个日志输出,一个包搞一个logger,每个引一个实例就好了
在这里插入图片描述
以后还缺消息往里面添加方法就好了,现在消息一个是注册的时候用的,一个heartbeat,执行器返回的结果也需要交给一个方法,由这个方法返回回去,这个就是rpc
在这里插入图片描述
现在网络搭起来,下面就是完成业务了
在这里插入图片描述
现在第三方开源的协议已经发生了变化,以后可能就收费了,以后可能到平台阶段,写工具集成了
在这里插入图片描述
做软件先要从小模块开始做,一个个搞定再连起来
在这里插入图片描述
一个软件的大体架构

在这里插入图片描述
日志很重要
在这里插入图片描述
python调用popen,照样执行,也能获得结果,获得结果有,pipe有问题会deadlock,所以我们不用

在这里插入图片描述
agent主要定义需要做什么事情
在这里插入图片描述
最后发消息,必须把消息定义好
在这里插入图片描述

在这里插入图片描述
如何取ip地址而且去分类

在这里插入图片描述
有了heartbeat就要去解决网络链接了
在这里插入图片描述
一般几秒一次心跳,最慢的30秒左右,每次查询ip是不好的,反复查询,就可以用缓存,省的每次都去查,起个线程监控一下就行
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值