zoukankan      html  css  js  c++  java
  • Func系列3:自定义模块

    简介

    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自动化运维技术与最佳实践》整理

  • 相关阅读:
    JBPM 入门阅读
    Jquery ligerui下拉框复选,使下拉框中相应值对勾选中
    spring quartz 1.6配置方法
    断点续传的原理
    转:DWR详细应用介绍
    转:第一个DWR示例
    解决(CXF):SOAPFaultException: Fault occurred while processing
    s2sh保存错误: a different object with the same identifier value was already associated
    解决 java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit(IILjava/lang/String;Ljava/lan
    转载:struts2重要标签学习
  • 原文地址:https://www.cnblogs.com/MacoLee/p/5783070.html
Copyright © 2011-2022 走看看