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

Salt的底层通信是通过ZeroMQ完成的,采用了ZeroMQ的订阅发布模式(Pub和Sub),如下图所示。

1284087-20190916185948282-131929450.png

简单来讲,Pub/Sub模式类似于广播电台,在订阅发布模式中Pub将消息发送到总线,所有的Sub收到来自总线的消息后,根据自己的订阅条件来接收特定的消息。对应到Salt中就是master将事件发布到消息总线,minion订阅并监听事件,然后minion会查看事件是否 ,通过正则匹配的各种方法去匹配minion。下面简要说明下Saltmaster和minion的通信过程, Salt master启动时会监听两个端口,默认是4505和4506。

4506的作用: Salt Master Ret接口,支持认证(auth)、文件服务、结果收集等功能;   
4505的作用:Salt Master pub接口,提供远程执行命令发送功能。

Salt minion启动时从配置文件中获取master的地址,如果为域名,则进行解析。解析完成后,会连接master的4506(Ret接口)进行key认证。认证通过,会获取到master的publish_port(默认是4505),然后连接publish_port订阅来自master pub接口的任务。当master下发操作指令时,所有的minion都能接收到,然后minion会检查本机是否匹配。如果匹配,则执行。执行完毕后,把结果发送到master的4506(Ret接口)由master进行处理,命令发送通信完全是异步的,并且命令包很小。此外,这些命令包通过maqpack进行序列化后数据会进一步压缩(Maqpack是一种高效的二进制序列化格式),所以Salt的网络负载非常低。

二、编写自定义模块

编写一个自定义的测试模块 hello.py。默认情况下,我们的定制化模块存放于/srv/salt/_modules/文件夹下,这个文件夹并不是默认创建的,需要手动创建。

[root@29-server ~]# mkdir -pv /srv/salt/_modules/
[root@29-server ~]# cd /srv/salt/_modules/

[root@29-server _modules]# cat hello.py
def world():
    """
    It is my first function.
    Example:
        salt '*' hello.world
    """
    return "hello world!"

模块添加完毕后,我们需要把模块推送到所有minion上。

[root@29-server _modules]# salt "*" saltutil.sync_modules
minion-one:
    - modules.hello

返回结果是minion接收到的新模块名。由于每个minion都接收了我们的新模块,所以全部返回了- modules.hello。

[root@29-server _modules]# salt "*" hello.world
minion-one:
    hello world!

查看模块帮助信息

[root@29-server _modules]# salt "minion-one" sys.doc hello
hello.world:

    It is my first function.
    Example:
        salt '*' hello.world

三、交叉调用salt自带的模块函数

1.__salt__
2.__grains__
3.__pillar__
4.__virtual__

转载于:https://www.cnblogs.com/wangyajian/p/11590485.html