分布式管理-salt / 未分类 · 2015年6月2日

Saltstack自定义模块(转)

步骤
首先需要在master机器的file_roots 下建一个_modules文件夹,里面放.py 文件,也就是自定义模块。
file_roots 在/etc/salt/master 里可以设置,默认是/srv/salt/,即你需要在这个目录下新建文件夹_modules
在_modules里新建自定义模块,然后编写相应的代码。
比如模块名是foo,在里面定义了方法bar。
写完代码后,使用命令 salt '*' saltutil.sync_all 将自定义模块同步到各个minion上。
也可以使用 salt '*' saltutil.sync_modules 将自定义模块同步到minion上
运行自定也模块,使用命令 salt ‘*’ foo.bar
cd /data/
mkdir _modules
[root@maste _modules]# tree /data/_modules/
/data/_modules/
`– foo.py
[root@maste _modules]# cat foo.py
# coding: utf-8
def bar():
CMD_RUN = __salt__['cmd.run']
cmd = "ls /etc/init"
return CMD_RUN(cmd)

# 解释
# 自定义模块会加载__salt__变量,这个dict变量里包含所有的salt function
# 上面的cmd.run就是salt的命令运行函数
# __salt__变量必须在自定义的模块里使用,也就是必须在自定一的方法中使用,
# 如上面的bar方法,不能将__salt__变量放到全局变量中使用,否则会报__salt__变量为定义
salt '*' saltutil.sync_all
salt '*' foo.bar

注意事项
如果要使用__salt__变量,必须要在自定义的方法中使用,不能在全局变量中使用。
如果运行命令报错了,如报 foo.bar is not avaliable,请到minion机器上去查看具体的日志。
报上述错误并不是模块没有同步到minion上,而是你编写的模块运行有问题。
minion的日志记录在/var/log/salt/minion中,可以去这里查看具体错误。
实现自定义模块的过程中,可以发扬NIH(Not invent here)的思想。
可以充分利用__salt__变量里的salt自带函数来实现你想要的功能。
http://runforever.github.io/blog/2014-07-11-saltstack%E8%87%AA%E5%AE%9A%E4%B9%89%E6%A8%A1%E5%9D%97.html