最近在看saltstack的源代碼,瞭解裏面的流程,看了下salt命令的執行流程。想一想本身能不能改造下源代碼,因而本身在那想需求。後來想一想能不能在執行salt的時候指定jid啊。python
先說下需求:web
指定salt命令的jidide
相似這樣的:ui
開始動手實現。spa
第一步命令行
修改salt.utils.parsers.SaltCMDOptionParser類,增長命令行選項。orm
self.add_option( '-j','--jid', dest='jid', default='', help=('Set the job\'s id,' 'like 20140903143821048459') )
第二步blog
修改salt.utils.parsers.OptionParser類,用於判斷jid的合法性。get
# 在parse_args方法返回前,調用這個方法 if hasattr(options,'jid'): self._check_jid(options.jid) return options, args # 檢查jid的合法性 def _check_jid(self,jid=''): try: if jid == '': pass elif len(jid) != 20: raise optparse.OptionValueError('jid needs 20 length and is numberic str,like "20140903143821048459"') else: import re if not re.match(r'\d{20}',jid): raise optparse.OptionValueError('jid needs 20 length and is numberic str,like "20140903143821048459"') except optparse.OptionValueError,e: print(e) sys.exit(1)
第三步it
修改salt.cli.SaltCMD類
try: local = salt.client.LocalClient(self.get_config_file_path(),self.options.jid) #修改 except SaltClientError as exc: self.exit(2, '{0}\n'.format(exc)) return if self.options.batch: batch = salt.cli.batch.Batch(self.config,jid=self.options.jid) # 修改
第四步
修改salt.client.LocalClient類
def __init__(self, c_path=os.path.join(syspaths.CONFIG_DIR, 'master'), jid='',mopts=None): # 增長jid參數 ...... self.jid = jid # 增長屬性 self.serial = salt.payload.Serial(self.opts) def run_job(self,tgt,fun,....): # jid = '' jid = self.jid
第五步
修改salt.cli.batch.Batch類
def __init__(self, opts, quiet=False,jid=''): # 增長jid self.opts = opts self.quiet = quiet self.local = salt.client.LocalClient(opts['conf_file'],jid) # 增長jid self.minions = self.__gather_minions()
全部步驟完成,重啓master和minion。
噹噹噹。。。
修改爲功。
爲何要加這個功能,由於後臺管理系統在執行任務的時候,須要先由web頁面產生一個jid。經過這個jid去查詢一些信息。