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 [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的通信模式


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值