saltstack使用指南:编写自己的模块代码

saltstack编写自己的模块代码

1. saltstack远程执行的底层原理
2. 执行模块的组成结构
3. 编写自己的执行模块函数
4. 交叉调用salt自带的模块函数
5. 实战编写一个完整的模块

一、saltstack远程执行的底层原理

salt的底层通信是通过ZeroMQ完成的,采用了ZeroMQ的订阅发布模式(pub/sub)。

saltstack使用指南:编写自己的模块代码_第1张图片

简单的来讲,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_函数,后面用"[]"括起来的内容是函数的格式,"()"括起来的内容为函数的参数。

五、实战编写一个完整的模块

你可能感兴趣的:(salt)