1.在scripts.py文件中salt_minion()函数如下代码:
minion = salt.cli.daemons.Minion() minion.start()
2.在daemons.py文件中类Minion的start执行如下代码
class Minion(parsers.MinionOptionParser, DaemonsMixin) .... 1.解析命令行参数及配置文件 2.执行start方法前先执行prepare()方法,检查启动的必须项是否配置,并且必须的环境目录是否存在 self.minion = salt.minion.Minion(self.config) self.minion.tune_in()
3.在minion.py文件中的tune_in()方法中执行如下代码
self.sync_connect_master()
4.在minion.py中sync_connect_master()方法如下
sync_connect_master()方法会一直阻塞,直到连接master为止 代码如下: self._connect_master_future = self.connect_master() 该方法调用self.connect_master()方法
5.connect_master方法如下:
master, self.pub_channel = yield self.eval_master(self.opts, self.timeout, self.safe) yield self._post_master_init(master)
6.self.eval_master()方法如下:
pub_channel = salt.transport.client.AsyncPubChannel.factory(self.opts, **factory_kwargs) yield pub_channel.connect() #AsyncPubChannel类用于生成一个类来创建到master的Publisher的一个订阅通道 该类的factory方法会返回return salt.transport.zeromq.AsyncZeroMQPubChannel(opts, **kwargs) salt.transport.zeromq.AsyncZeroMQPubChannel类在实例化时操作如下: self.auth = salt.crypt.AsyncAuth(self.opts, io_loop=self.io_loop) self.serial = salt.payload.Serial(self.opts) self.context = zmq.Context() self._socket = self.context.socket(zmq.SUB) 最终先调用AsyncZeroMQPubChannel.connect()方法 connect方法中的代码如下: if not self.auth.authenticated: yield self.auth.authenticate() self.publish_port = self.auth.creds[‘publish_port‘] self._socket.connect(self.master_pub) #可以看出在连接之前的操作是进行认证操作
7.salt-minion的认证流程如下:
本文出自 “浪淘沙” 博客,请务必保留此出处http://zhujiangtao.blog.51cto.com/6387416/1888502
原文:http://zhujiangtao.blog.51cto.com/6387416/1888502