最近在看saltstack的源代碼,瞭解裏面的流程,看了下salt命令的執行流程。想想自己能不能改造下源代碼,於是自己在那想需求。後來想想能不能在執行salt的時候指定jid啊。
先說下需求:
指定salt命令的jid
類似這樣的:
開始動手實現。
第一步
修改salt.utils.parsers.SaltCMDOptionParser類,增加命令行選項。
self.add_option( '-j','--jid', dest='jid', default='', help=('Set the job\'s id,' 'like 20140903143821048459') )
第二步
修改salt.utils.parsers.OptionParser類,用於判斷jid的合法性。
# 在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)
第三步
修改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去查詢一些信息。