SaltStack源码解析一
本文从sal命令行命令执行的角度,剖析一下saltstack的运行过程。代码分析过程结合运行日志进行解析。命令执行过程
在终端输入salt '*' cmd.run ls命令
#salt "*" cmd.run ls
cloudstack-agent_4.2.0_all.deb
cloudstack-common_4.2.0_all.deb
zmq
我们看一下salt master的输出日志
2014-01-03 14:28:36,087 [-1221166336] Clear payload received with command publish
2014-01-03 14:28:36,497 [-1221166336] User root Published command cmd.run with jid 20140103142836087085
2014-01-03 14:28:36,499 [-1221166336] Published command details {'tgt_type': 'glob', 'jid': '20140103142836087085', 'tgt': 'stack', 'ret': '', 'user': 'root', 'arg': ['ls'], 'fun':
'cmd.run'}
2014-01-03 14:28:38,617 [-1221166336] AES payload received with command _return
2014-01-03 14:28:38,622 [-1221166336] Got return from stack for job 20140103142836087085
2014-01-03 14:28:39,201 [-1221166336] Clear payload received with command _auth
2014-01-03 14:28:39,203 [-1221166336] This salt-master instance has accepted 1 minion keys.
2014-01-03 14:28:39,205 [-1221166336] Authentication request from stack
2014-01-03 14:28:39,208 [-1221166336] Authentication accepted from stack
2014-01-03 14:28:40,371 [-1221166336] AES payload received with command _return
2014-01-03 14:28:40,374 [-1221166336] Got return from stack for job 20140103142836087085
看一下客户端minion的运行日志
2014-01-03 14:28:36,522 [-1221879040] User root Executing command cmd.run with jid 20140103142836087085
2014-01-03 14:28:36,527 [-1221879040] Command details {'tgt_type': 'glob', 'jid': '20140103142836087085', 'tgt': 'stack', 'ret': '', 'user': 'root', 'arg': ['ls'], 'fun': 'cmd.run'}
2014-01-03 14:28:37,790 [-1221879040] Parsed args: ['ls']
2014-01-03 14:28:37,842 [-1221879040] Parsed kwargs: {'__pub_user': 'root', '__pub_arg': ['ls'], '__pub_fun': 'cmd.run', '__pub_jid': '20140103142836087085', '__pub_tgt':
'stack', '__pub_tgt_type': 'glob', '__pub_ret': ''}
2014-01-03 14:28:37,913 [-1221879040] Executing command 'ls' in directory '/root'
2014-01-03 14:28:38,607 [-1221879040] output: cloudstack-agent_4.2.0_all.deb
cloudstack-common_4.2.0_all.deb
zmq
2014-01-03 14:28:38,610 [-1221879040] Returning information for job: 20140103142836087085
执行过程解析
1. Salt stack的Master与Minion之间通过ZeroMq进行消息传递,使用了ZeroMq的发布-订阅模式,连接方式包括tcp,ipc
2. salt命令,将cmd.run ls命令从salt.client.LocalClient.cmd_cli发布到master,获取一个Jodid,根据jobid获取命令执行结果。
3. master接收到命令后,将要执行的命令发送给客户端minion。
4. minion从消息总线上接收到要处理的命令,交给minion._handle_aes处理
5. minion._handle_aes发起一个本地线程调用cmdmod执行ls命令。线程执行完ls后,调用minion._return_pub方法,将执行结果通过消息总线返回给master
6. master接收到客户端返回的结果,调用master._handle_aes方法,将结果写的文件中
7.
salt.client.LocalClient.cmd_cli通过轮询获取Job执行结果,将结果输出到终端。
心得:
1. Salt master和minion之间通过zeromq进行通信,传递消息。阅读salt源码,需要了解zeromq的使用方法
2. salt都使用了zeromq的pub-sub模式,req-rep模式
3. salt 使用了tcp,ipc的通信模式
版权声明:本文为博主原创文章,未经博主允许不得转载。
页:
[1]