有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是不好的,反复查询,就可以用缓存,省的每次都去查,起个线程监控一下就行