编写Func自定义模块

发布于 2022-10-15 08:18:15 字数 6556 浏览 23 评论 0

编写Func自定义模块

Func是目前redhat系列平台最棒的集群管理工具(个人看法),发现越来越多的人已经开始在使用,从接触的大部分人都会说自带的模块已经够用了。其实在我们的日常维护当中,尤其是大规模的服务器集群、满天飞的业务系统等等。此时Func自带的模块已经远远不能满足我们的需求,现介绍Func是如何实现一个简单的自定义模块的。

[方法一]
通过CommandModule来实现,只需修改要运行命令参数就可以了。

优点:简单、部署方便;
缺点:不够灵活,扩展性弱;
适合场景:中小型集群;

命令方式:

  1. #查看所有服务器时间;
  2. func "*" call command run "/bin/date"
  3. #查看所有服务器系统日志,执行的超时时间为3秒;
  4. func -t 3 "*" call command run "/usr/bin/tail -10 /var/log/messages"
  5. #查看所有主机uptime,开启5个线程来运行(主机数超过10台建议开启);
  6. func -t 3 "*" call --forks="5" command run "/usr/bin/uptime"
  7. 复制代码

复制代码python api方式:

  1. import func.overlord.client as fc
  2. client = fc.Client("*")
  3. print fc.client.command.run("/usr/bin/tail -10 /var/log/messages")

复制代码复制代码

[方法二]
通过编写func模块来达到扩展的目的。

优点:可以根据自身的应用特点定制,扩展性非常强;
缺点:复杂、部署不够方便;
适合场景:大型集群;

操作:
1、模块存放位置说明
/usr/local/lib/python2.5/site-packages/func/minion/modules/(源码安装位置)
or
/usr/local/python2.5/site-packages/func/minion/modules/(rpm或yum安装默认位置)

2、func-create-module 建模块工具
填写相关项,比较简单就不一一说明了。
#cd /usr/local/lib/python2.5/site-packages/func/minion/modules
#func-create-module

Module Name: MyModule
Description: My module for func.
Author: liutiansi
Email: liutiansi@gmail.com

Leave blank to finish.
Method: echo
Method:
Your module is ready to be hacked on. Wrote out to mymodule.py.

3、编写模块代码

  1. #vi mymodule.py
  2. #
  3. # Copyright 2010
  4. # liutiansi <liutiansi@gmail.com>
  5. #
  6. # This software may be freely redistributed under the terms of the GNU
  7. # general public license.
  8. #
  9. # You should have received a copy of the GNU General Public License
  10. # along with this program; if not, write to the Free Software
  11. # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  12. import func_module
  13. class Mymodule(func_module.FuncModule):
  14.      # Update these if need be.
  15.      version = "0.0.1"
  16.      api_version = "0.0.1"
  17.      description = "My module for func."
  18.      def echo(self):
  19.          """
  20.          TODO: Document me ...
  21.          """
  22.          pass

复制代码复制代码
系统已经帮我们自动生成了一些初始化代码,只需在此基础上做修改就可以了。如简单根据我们指定的条数返回最新系统日志,修改后的代码如下:

  1. #
  2. # Copyright 2010
  3. # liutiansi <liutiansi@gmail.com>
  4. #
  5. # This software may be freely redistributed under the terms of the GNU
  6. # general public license.
  7. #
  8. # You should have received a copy of the GNU General Public License
  9. # along with this program; if not, write to the Free Software
  10. # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  11. import func_module
  12. from func.minion import sub_process
  13. class Mymodule(func_module.FuncModule):
  14.      # Update these if need be.
  15.      version = "0.0.1"
  16.      api_version = "0.0.1"
  17.      description = "My module for func."
  18.      def echo(self,vcount):
  19.          """
  20.          TODO: Document me ...
  21.          """
  22.          command="tail -n "+str(vcount)+" /var/log/messages"
  23.          cmdref = sub_process.Popen(command, stdout=sub_process.PIPE,
  24.                                     stderr=sub_process.PIPE, shell=True,
  25.                                     close_fds=True)
  26.          data = cmdref.communicate()
  27.          return (cmdref.returncode, data[0], data[1])

复制代码复制代码
4、编写模块分发功能

  1. #cd ~
  2. #vi RsyncModule.py
  3. #!/usr/local/bin/python
  4. import sys
  5. import func.overlord.client as fc
  6. import xmlrpclib
  7. module = sys.argv[1]
  8. pythonmodulepath="/usr/local/lib/python2.5/site-packages/func/minion/modules/"
  9. client = fc.Client("*")
  10. fb   = file(pythonmodulepath+module, "r").read()
  11. data = xmlrpclib.Binary(fb)
  12. #同步模块
  13. print client.copyfile.copyfile(pythonmodulepath+ module,data)
  14. #重启func服务
  15. print client.command.run("/etc/init.d/funcd restart")

复制代码复制代码

  1. #python RsyncModule.py mymodule.py
  2. {'NN-server1': 1}
  3. {'NN-server1': [0, 'Stopping func daemon: \nStarting func daemon: \n', '']}
  4. ................

复制代码5、模块调用

  1. func -t 10 "*" call mymodule echo 10
  2. {'NN-server1': [0,
  3.                    'May 30 04:02:06 SN2010-04-020 syslogd 1.4.1: restart.\n',
  4.                    '']}

复制代码大功告成!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

野鹿林 2022-10-22 08:18:15

{:3_189:}这个好啊,最近在研究用python写一个服务器管理系统
初步决定func+cgi方式web页面管理
持续关注

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文