一、salt远程执行的底层原理
Salt的底层通信是通过ZeroMQ完成的,采用了ZeroMQ的订阅发布模式(Pub和Sub),如下图所示。
简单来讲,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__