saltstack编写自己的模块代码
1. saltstack远程执行的底层原理
2. 执行模块的组成结构
3. 编写自己的执行模块函数
4. 交叉调用salt自带的模块函数
5. 实战编写一个完整的模块
一、saltstack远程执行的底层原理
salt的底层通信是通过ZeroMQ完成的,采用了ZeroMQ的订阅发布模式(pub/sub)。
简单的来讲,pub/sub模式类似于广播电台,在订阅发布模式中pub将信息发送到总线,所有的sub收到来自总线的信息后,根据自己的订阅条件来接收特定的消息。
对应到salt中就是,master负责将事件发布到消息总线,minion订阅并监听事件,然后minion会查看事件是否与自己匹配,确定是否需要执行。匹配条件是就之前讲到的多种主机匹配方法。
下面来了解一下salt-master和salt-minion的通信过程:salt启动时会监听两个端口,4505和4506
简单一句话:4505端口是用来发布消息的,4506端口则是与客户端通信、传输数据的。
1.salt minion启动时从配置文件中获取master的地址,如果为域名,则进行解析。
2.解析完成后,会连接master的4506端口(Ret接口)进行key认证。
3.认证通过,或获取到master的publish_port(默认是4505),然后连接publish_port订阅来自master pub接口的任务。
4.当master下发操作指令时,所有的minion都能接收到,然后minion会检查本机是否匹配。如果匹配,则执行。
5.执行完毕后,把结果发送到master的4506(Ret接口)由master进行处理。
注:命令发送通信完全是异步的,并且命令包很小。此外,这些命令包是通过maqpack进行序列化后数据会进一步压缩(Maqpack是一种高效的二进制序列化格式),所以salt的网络负载很低。
二、执行模块的组成结构
模块的源码位置:
[root@salt-master ~]# cd /usr/lib/python2.7/site-packages/salt/modules/
[root@salt-master modules]# vi test.py
def echo(text):
'''
Return a string - used for testing the connection
CLI Example:
.. code-block:: bash
salt '*' test.echo 'foo bar baz quo qux'
'''
return text
def sleep(length):
'''
Instruct the minion to initiate a process that will sleep for a given
period of time.
CLI Example:
.. code-block:: bash
salt '*' test.sleep 20
'''
time.sleep(int(length))
return True
其实,saltstack模块的执行函数就是python函数,但是结合了salt的远程执行功能就比较强大了。
三、编写自己的执行模块函数
默认情况下,我们的定制化模板存放于/srv/salt/_modules文件夹下,这个文件默认是没有创建的,需要手动创建。
[root@salt-master ~]# mkdir /srv/salt/_modules/
手动编写一个简单的模块函数:
[root@salt-master ~]# vi /srv/salt/_modules/haha.py
#!/usr/bin/python
def hello():
return 'hello,boy!'
将编写好的模块函数发送到minion端:
方法一:
[root@salt-master _modules]# salt '*' saltutil.sync_modules
方法二:[root@salt-master _modules]# salt '*' saltutil.sync_all
测试模块执行效果:
[root@salt-master _modules]# salt '*' haha.hello
izwz9f8xrvty50quc2gq50z:
hello,boy!
iZbp150ikdomqe3b32qaubZ:
hello,boy!
minion端模块存放位置:
[root@salt-slave-node1 opt]# cd /var/cache/salt/minion/extmods/modules/
[root@salt-slave-node1 modules]# ls
haha.py
注:saltutil模块用于管理minion的状态。
扩展:列出salttuil模块的所有函数及函数的用法示例
[root@salt-master _modules]# salt '*' sys.list_functions saltutil
[root@salt-master _modules]# salt '*' sys.doc saltutil.sync_modules
'saltutil.sync_modules:'
Sync the modules from the _modules directory on the salt master file
server. This function is environment aware, pass the desired environment
to grab the contents of the _modules directory, base is the default
environment.
New in version 2015.5.1
CLI Example:
salt '*' saltutil.sync_modules
四、交叉调用salt自带的模块函数
1. _salt_函数
[root@salt-master modules]# vi /usr/lib/python2.7/site-packages/salt/modules/useradd.py
........省略n行.........
def add(name,
uid=None,
gid=None,
groups=None,
home=None,
shell=None,
unique=True,
system=False,
fullname='',
roomnumber='',
workphone='',
homephone='',
createhome=True,
loginclass=None):
........省略n行.........
ret = __salt__['cmd.run_all'](cmd, python_shell=False)
注:从上面可以看出,useradd模块引用了_salt_函数,后面用"[]"括起来的内容是函数的格式,"()"括起来的内容为函数的参数。
五、实战编写一个完整的模块