简介
Func自带的模块已经非常丰富,但在日常系统运维当中,尤其是面对大规模的服务器集群、不同类别的业务平台,次是Func自带的模块或许已经不能满足我们的需求,所以有必要通过自定义模块来填补这块的不足。
自定义模块的步骤
生成模块----->编写逻辑----->分发模块----->执行模块
生成模块:通过fun-create-module命令创建模块初始模板
编写逻辑:即填充我们的业务功能逻辑
分发模块:将编写完成的模块分发到所有被控主机
执行模块:执行已分发完成的模块,调用方法与Func自带模块无差异
生成模块
切换到Func安装包minion模块存储目录:/usr/lib/python2.6/site-packages/func/minion/modules/,执行命令fun-create-module创建模块
cd /usr/lib/python2.6/site-packages/func/minion/modules/ fun-create-module #后面就按照提示进行操作
结果:
[root@wx modules]# func-create-module Module Name: MyModule Description: My Module for func. Author: Macolee Email: lihui__love@163.com Leave blank to finish. Method: echo Method: Your module is ready to be hacked on. Wrote out to mymodule.py.
最终生成了一个初始化的模块代码文件mymodule.py
【/usr/lib/python2.6/site-packages/func/minion/modules/mymodule.py】
# # Copyright 2016 # Macolee <lihui__love@163.com> # # This software may be freely redistributed under the terms of the GNU # general public license. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. import func_module class Mymodule(func_module.FuncModule): # Update these if need be. version = "0.0.1" api_version = "0.0.1" description = "My Module for func." def echo(self): """ TODO: Document me ... """ pass
编写逻辑
这一步只需在上述模块基础上修改即可,如模块实现一个根据指定的条数返回最新系统日志(/var/log/messages)信息,修改后代码如下:
【/usr/lib/python2.6/site-packages/func/minion/modules/mymodule.py】
# # Copyright 2016 # Macolee <lihui__love@163.com> # # This software may be freely redistributed under the terms of the GNU # general public license. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. import func_module class Mymodule(func_module.FuncModule): # Update these if need be. version = "0.0.1" api_version = "0.0.1" description = "My Module for func." def echo(self,vcount): """ TODO: response system messages info """ command = "/usr/bin/tail -n"+str(vcount)+"/var/log/messages" cmdref = sub_process.Popen(command,stdout=sub_process.PIPE,stderr=sub_process.PIPE,shell=True,close_fds=True) data = cmdref.communicate() return (cmdref.returncode,data[0],data[1])
分发模块
首先编写分发模块的功能,使用Func的copyfile模块来实现,原理是:读写主控端func minion包下的模块文件(参数传入),通过Func的copyfile模块同步到目标主机的同路径下。一次编写可持续使用。
【/home/test/func/RsyncModule.py】
#!/usr/bin/env python #-*- coding:utf-8 -*- import sys import func.overlord.client as fc import xmlrpclib module = sys.argv[1] pythonmodulepath = '/usr/lib/python2.6/site-packages/func/minion/modules/' client = fc.Client('*') fb = file(pythonmodulepath+module,'r').read() data = xmlrpclib.Binary(fb) #分发模块 print client.copyfile.copyfile(pythonmodulepath+module,data) #重启Func服务 print client.command.run('/etc/init.d/funcd restart')
分发命令:
cd /home/test/func/ cp /usr/lib/python2.6/site-packages/func/minion/modules/mymodule.py /home/test/func/ python RsyncModule.py mymodule.py
检查被控主机的/usr/lib/python2.6/site-packages/func/minion/modules/目录是否多了一个mymodule.py文件,是则说明分发成功。
执行模块
func '*' call mymodule echo 5
参考资料:
根据刘天斯《Python自动化运维技术与最佳实践》整理
关注我的公众号,不定期推送资讯
本文来自博客园,作者:链条君,转载请注明原文链接:https://www.cnblogs.com/MacoLee/p/5783070.html