|
本文从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 [master.py] [_handle_clear] [640] [master] [-1221166336] [MainThread] [salt.master ][INFO ] Clear payload received with command publish
2014-01-03 14:28:36,497 [master.py] [publish] [2520] [master] [-1221166336] [MainThread] [salt.master ][INFO ] User root Published command cmd.run with jid 20140103142836087085
2014-01-03 14:28:36,499 [master.py] [publish] [2530] [master] [-1221166336] [MainThread] [salt.master ][DEBUG ] 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 [master.py] [_handle_aes] [664] [master] [-1221166336] [MainThread] [salt.master ][INFO ] AES payload received with command _return
2014-01-03 14:28:38,622 [master.py] [_return] [1236] [master] [-1221166336] [MainThread] [salt.master ][INFO ] Got return from stack for job 20140103142836087085
2014-01-03 14:28:39,201 [master.py] [_handle_clear] [640] [master] [-1221166336] [MainThread] [salt.master ][INFO ] Clear payload received with command _auth
2014-01-03 14:28:39,203 [verify.py] [check_max_open_files] [392] [verify] [-1221166336] [MainThread] [salt.utils.verify][DEBUG ] This salt-master instance has accepted 1 minion keys.
2014-01-03 14:28:39,205 [master.py] [_auth] [1795] [master] [-1221166336] [MainThread] [salt.master ][INFO ] Authentication request from stack
2014-01-03 14:28:39,208 [master.py] [_auth] [1922] [master] [-1221166336] [MainThread] [salt.master ][INFO ] Authentication accepted from stack
2014-01-03 14:28:40,371 [master.py] [_handle_aes] [664] [master] [-1221166336] [MainThread] [salt.master ][INFO ] AES payload received with command _return
2014-01-03 14:28:40,374 [master.py] [_return] [1236] [master] [-1221166336] [MainThread] [salt.master ][INFO ] Got return from stack for job 20140103142836087085
看一下客户端minion的运行日志
2014-01-03 14:28:36,522 [minion.py] [_handle_aes] [612] [minion] [-1221879040] [MainThread] [salt.minion ][INFO ] User root Executing command cmd.run with jid 20140103142836087085
2014-01-03 14:28:36,527 [minion.py] [_handle_aes] [618] [minion] [-1221879040] [MainThread] [salt.minion ][DEBUG ] Command details {'tgt_type': 'glob', 'jid': '20140103142836087085', 'tgt': 'stack', 'ret': '', 'user': 'root', 'arg': ['ls'], 'fun': 'cmd.run'}
2014-01-03 14:28:37,790 [minion.py] [parse_args_and_kwargs] [165] [minion] [-1221879040] [MainThread] [salt.minion ][DEBUG ] Parsed args: ['ls']
2014-01-03 14:28:37,842 [minion.py] [parse_args_and_kwargs] [166] [minion] [-1221879040] [MainThread] [salt.minion ][DEBUG ] 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 [cmdmod.py] [_run] [283] [cmdmod] [-1221879040] [MainThread] [salt.loaded.int.module.cmdmod][INFO ] Executing command 'ls' in directory '/root'
2014-01-03 14:28:38,607 [cmdmod.py] [run] [501] [cmdmod] [-1221879040] [MainThread] [salt.loaded.int.module.cmdmod][DEBUG ] output: cloudstack-agent_4.2.0_all.deb
cloudstack-common_4.2.0_all.deb
zmq
2014-01-03 14:28:38,610 [minion.py] [_return_pub] [828] [minion] [-1221879040] [MainThread] [salt.minion ][INFO ] 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的通信模式
版权声明:本文为博主原创文章,未经博主允许不得转载。 |
|
|