llcong 发表于 2015-10-14 08:31:02

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]
查看完整版本: SaltStack源码解析一