salt-master启动过程
环境介绍
我们使用如下环境来分析SaltStack源码:
系统:CentOS-7
python版本:2.7.5
saltstack版本:2015.5.2 (Lithium)
我们使用如下方法来安装salt-master:
rpm -Uvh http://mirrors.opencas.cn/epel/7/x86_64/e/epel-release-7-5.noarch.rpm
yum install salt-master
场景描述
本节分析salt-master启动过程,我们使用如下命令启动salt-master:
/usr/bin/salt-master -d
总体分析
salt-master的启动过程可简单分为两块,一是解析配置文件和命令行参数,二是启动所需进程。
对于解析命令行参数,主要使用到python标准模块optparse,解析master配置文件使用yaml模块。
主要过程为:
1、导入salt.syspaths作为命令行参数默认值,导入salt.config作为master配置文件默认值;
2、ConfigDirMixIn,LogLevelMixIn,RunUserMixin等几个类使用optparse的add_option注册命令行选项;
3、调用parse_args函数,解析命令行参数,解析master配置文件;
4、调用self.master.start(),注册sigusr1和sigusr2信号,分别用来输出堆栈和profile信息;
5、接着启动所需进程,如maintenance进程,publisher进程,master event进程等。
详细分析
函数调用流程图
核心类功能介绍
类关系图
MasterOptionParser类
此类主要用来解析命令行参数和yaml配置文件。继承了python标准optparse.OptionParser类,以前这六个类ConfigDirMixIn,LogLevelMixIn,RunUserMixin,DaemonMixIn,PidfileMixin,SaltfileMixIn分别用来注册配置文件路径,日志等级,守护进程,pid文件路径,saltfile路径等命令行选项。重写了optparse.OptionPaser的parse_args方法,添加对master yaml配置文件的解析。
Maintenance进程
Maintenance进程是用来做master的常规维护工作,如维护定时任务.
Publisher Server
绑定了默认的4505 zmq pub端口和publish_pull.ipc pull类型ipc,只要向publish_pull.ipc push数据,凡是subcribe 4505 publisher的client都将收到数据,具体此server什么作用还没有看.
EventPublisher Server
绑定了master_event_pub.ipc pub和master_event_pull.ipc pull,只要向master_event_pull.ipc push数据,订阅master_event_pub.ipc的client将收到消息.
ReqServer Server
启动了多个Mworker进程,每个进程连接workers.ipc REP,再启用了zmq_device,绑定tcp port 4506 ROUTER和workers.ipc DEALER,这样只要向4506 发送REQ数据,将会负载均衡到Mworker进程,Mworker进程收到请求后执行_handle_payload函数,也就是执行相应的模块.
salt-minion启动过程
功能介绍
salt-minion负责接收salt-master的消息,执行相应的指令。
环境介绍
系统:CentOS-7
python版本:2.7.5
saltstack版本:2015.5.2 (Lithium)
场景描述
本节分析salt-minion启动过程,我们使用如下命令启动salt-minion:
/usr/bin/salt-minion -d
总体分析
salt-minion启动过程总体分析如下:
1、使用parsers.MinionOptionParser类解析命令行参数及配置文件,此类继承了MasterOptionParser类,与salt-master解析过程差不多;
2、加载必要的模块,如grains,pillar;
3、开始连接salt-master的Req Server,评估与master的验证状态,如果master没有把minion的key加入信任列表,minion则循环验证直到验证通过;
4、发送消息通过master,minion已启动;
5、订阅salt-master pub服务器。
详细分析
函数调用流程图
salt-minion启动过程
核心类功能介绍
类关系图
MinionOptionParser类
MinionOptionParser类继承了MasterOptionParser,覆盖了MasterOptionParser的setup_config方法,改为由之前的master配置文件为minion配置文件。MasterOptionParser的讲解可以参考SaltStack源码解析 — salt-master启动过程
Minion类
这个应该算是比较重要的类了,包括了与master通信的所有方法。比如_do_socket_recv,负责接收master pub信息;_do_event_poll,负责处理事件;authenticate负责处理与master的验证。
Master与Minion认证过程
前言
在Minion进程启动的时候,先会连接Master的Req Server请求认证,直到认证成功才会继续。下面我们分析其认证过程。
总体概述
1、完成Minion进程启动前,Minon向Master Req Server发送cmd为_auth的payload消息;
2、Master Req Server收到Minion的消息后,使用_auth方法执行认证处理;
3、开始对key文件作如下判断,如果key在minions_rejected目录,则拒绝连接;如果key在minions目录,验证pub key是否相等,如果不相等,加入到minions_denied;如果key不在minions_pre目录,则把key写入到minions_pre目录;如果minions_pre不存在,如果pub key验证不通过,加入到minions_denied目录。
minion认证请求过程活动图
minion发送认证请求函数调用图
master处理minion验证请求函数调用图
salt ‘*’ test.ping执行过程
前言
本文我们来学习salt ‘*’ test.ping命令实现的整个过程,涉及的组件比较多,将有助于更进一步了解SaltStack的运行机制。
总体概述
salt ‘*’ test.ping涉及的组件比较多,包括Master Req Server,Master Publisher,Minion,Master EventPubliser等,现在概要地介绍下整个实现流程:
1、在salt-master机器执行salt ‘*’ test.ping命令;
2、salt向Master Req Server发送带publish命令的消息;
3、Master Req Server收到消息后向publish_pull.ipc push消息;
4、Master Publisher向Minion Publish消息;
5、Minion收到消息后启动一个新进程来执行消息中fun指定的函数;
6、函数执行完成后,返回结果给Master Req Server;
7、Master Req Server把结果push给Master EventPublisher;
8、这时因为salt客户端订阅了Master EventPublisher,将收到返回结果,之后直接输出到终端。整个流程结束。
活动图
为了更清楚了解整个流程,下面是活动图:
salt ‘*’ test.ping函数调用图
Master Req Server处理salt test.ping消息函数调用图
Minion处理Master Pub消息函数调用图
Master Req Server处理Minion数据返回函数调用图