环境介绍
我们使用如下环境来分析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
前置阅读
- 解析命令行参数用到: 深刻理解Python中的元类(metaclass)
- 由于命令行参数解析的类继承了optparse类,需要理解此类才能更好的理解saltstack解析命令行参数过程:python optparse模块源码解析
- multiprocessing.process的使用:https://docs.python.org/2/library/multiprocessing.html#multiprocessing.Process
总体分析
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函数,也就是执行相应的模块.