Salt的执行模块函数并没有什么特别之处,它们实际上就是Python函数,但是当它们结合上Salt的远程执行功能就会变得非常强大。当然,我们可以用Python扩展出自己的模块。
默认情况下,我们的定制化模块存放在/srv/salt/_modules
文件夹下,这个文件夹不是默认创建的,需要建立对应的目录并添加文件
mkdir -pv /srv/salt/_modules/
创建完之后就可以在该文件下写第一个我们自己的模块了
def world():
"""
This is hello function.
CLI Example:
salt '*' hello.world
"""
return 'Hello world'
模块添加完成后,需要把模块推送到所有minion上,命令如下:
[root@localhost _modules]# salt "*" saltutil.sync_modules
minion-one:
- modules.hello
minion-two:
- modules.hello
返回结果是minion接收到的新模块名,接下来我们就可以测试模块的执行效果了:
[root@localhost _modules]# salt "*" hello.world
minion-two:
Hello world
minion-one:
Hello world
ok,这样我们就成功的完成了第一个模块的编写执行,虽然这个例子很简单,但是python语言能提供的强大功能都可以编写成Salt模块,并通过远程执行的方式进行调用。
实战编写一个完整模块
作为系统管理员可能经常需要查出当前系统最占用内存的程序以及当前系统中最占用CPU的程序,下面我们就把这个常用的功能写成一个模块,让它使用起来更加便捷。
vi /srv/salt/_modules/prank.py
# -*- coding: utf-8 -*-
'''
The top nth processes which take up CPU and memory space usage are available through this module, additional;
The module can get the system load information.
'''
# Import python libs
import os
# Import salt libs
import salt.utils
def cpu(n):
'''
Return the top nth processes which take up the CPU usage for this minion
CLI Example:
salt '*' prank.cpu <n>
'''
cmd = "ps axu|sort -k3 -nr|head -n%s" % str(n)
output = __salt__['cmd.run_stdout'](cmd)
res = []
for line in output.splitlines():
res.append(lines)
return res
def mem(n):
'''
Return the top nth processes which take up the memory usage for this minion
CLI Example:
salt '*' prank.mem <n>
'''
cmd = "ps axu|sort -k4 -nr|head -n%s" % str(n)
output = __salt__['cmd.run_stdout'](cmd)
res = []
for line in output.splitlines():
res.append(lines)
return res
def load():
'''
Return the load averages for this minion
CLI Example:
.. code-block:: bash
salt '*' prank.loadavg
'''
load_avg = os.getloadavg()
return {'1-min': load_avg[0],
'5-min': load_avg[1],
'15-min': load_avg[2]}
这个模块中cpu(n)
和mem(n)
分别调用了__salt__['cmd.run_stdout']
来执行命令,最后将命令返回结果传回给master显示,load()
函数用系统的os模块收集了load情况。
模块编写完成后执行模块同步命令:
[root@localhost _modules]# salt "*" saltutil.sync_modules
minion-one:
- modules.prank
minion-two:
- modules.prank
同步完成后就可以使用命令查看最占CPU或者最占内存的程序了
salt "*" prank.cpu 4
salt "*" prank.mem 4