/usr/bin/salt
#!/usr/bin/python ‘‘‘ Publish commands to the salt system from the command line on the master. ‘‘‘ from salt.scripts import salt_main if __name__ == ‘__main__‘: salt_main()
调用scripts程序中的salt_main函数
然后再调用/usr/lib/python2.6/site-packages/salt/cli/__init__.py 中的SaltCMD类,然后再调用这个类中的run函数
def salt_main(): ‘‘‘ Publish commands to the salt system from the command line on the master. ‘‘‘ if ‘‘ in sys.path: sys.path.remove(‘‘) try: client = salt.cli.SaltCMD() client.run() except KeyboardInterrupt: raise SystemExit(‘\nExiting gracefully on Ctrl-c‘)
SaltCMD类调用了/usr/lib/python2.6/site-packages/salt/utils/parsers.py中的SaltCMDOptionParser类
class SaltCMD(parsers.SaltCMDOptionParser): ‘‘‘ The execution of a salt command happens here ‘‘‘ def run(self): ‘‘‘ Execute the salt command line ‘‘‘ self.parse_args() if self.config[‘verify_env‘]: if not self.config[‘log_file‘].startswith((‘tcp://‘, ‘udp://‘, ‘file://‘)): # Logfile is not using Syslog, verify verify_files( [self.config[‘log_file‘]], self.config[‘user‘] ) # Setup file logging! self.setup_logfile_logger() try: local = salt.client.LocalClient(self.get_config_file_path()) except SaltClientError as exc: self.exit(2, ‘{0}\n‘.format(exc)) return if self.options.batch: batch = salt.cli.batch.Batch(self.config) # Printing the output is already taken care of in run() itself for res in batch.run(): pass else: if self.options.timeout <= 0: self.options.timeout = local.opts[‘timeout‘] kwargs = { ‘tgt‘: self.config[‘tgt‘], ‘fun‘: self.config[‘fun‘], ‘arg‘: self.config[‘arg‘], ‘timeout‘: self.options.timeout, ‘show_timeout‘: self.options.show_timeout} if ‘token‘ in self.config: try: with salt.utils.fopen(os.path.join(self.config[‘cachedir‘], ‘.root_key‘), ‘r‘) as fp_: kwargs[‘key‘] = fp_.readline() except IOError: kwargs[‘token‘] = self.config[‘token‘] if self.selected_target_option: kwargs[‘expr_form‘] = self.selected_target_option else: kwargs[‘expr_form‘] = ‘glob‘ if getattr(self.options, ‘return‘): kwargs[‘ret‘] = getattr(self.options, ‘return‘) # If using eauth and a token hasn‘t already been loaded into # kwargs, prompt the user to enter auth credentials if ‘token‘ not in kwargs and self.options.eauth: resolver = salt.auth.Resolver(self.config) res = resolver.cli(self.options.eauth) if self.options.mktoken and res: tok = resolver.token_cli( self.options.eauth, res ) if tok: kwargs[‘token‘] = tok.get(‘token‘, ‘‘) if not res: sys.exit(2) kwargs.update(res) kwargs[‘eauth‘] = self.options.eauth if self.config[‘async‘]: jid = local.cmd_async(**kwargs) print(‘Executed command with job ID: {0}‘.format(jid)) return try: # local will be None when there was an error if local: if self.options.subset: cmd_func = local.cmd_subset kwargs[‘sub‘] = self.options.subset kwargs[‘cli‘] = True else: cmd_func = local.cmd_cli if self.options.static: if self.options.verbose: kwargs[‘verbose‘] = True full_ret = local.cmd_full_return(**kwargs) ret, out = self._format_ret(full_ret) self._output_ret(ret, out) elif self.config[‘fun‘] == ‘sys.doc‘: ret = {} out = ‘‘ for full_ret in local.cmd_cli(**kwargs): ret_, out = self._format_ret(full_ret) ret.update(ret_) self._output_ret(ret, out) else: if self.options.verbose: kwargs[‘verbose‘] = True for full_ret in cmd_func(**kwargs): ret, out = self._format_ret(full_ret) self._output_ret(ret, out) except (SaltInvocationError, EauthAuthenticationError) as exc: ret = str(exc) out = ‘‘ self._output_ret(ret, out) def _output_ret(self, ret, out): ‘‘‘ Print the output from a single return to the terminal ‘‘‘ # Handle special case commands if self.config[‘fun‘] == ‘sys.doc‘ and not isinstance(ret, Exception): self._print_docs(ret) else: # Determine the proper output method and run it salt.output.display_output(ret, out, self.config) if not ret: sys.exit(2) def _format_ret(self, full_ret): ‘‘‘ Take the full return data and format it to simple output ‘‘‘ ret = {} out = ‘‘ for key, data in full_ret.items(): ret[key] = data[‘ret‘] if ‘out‘ in data: out = data[‘out‘] return ret, out def _print_docs(self, ret): ‘‘‘ Print out the docstrings for all of the functions on the minions ‘‘‘ docs = {} if not ret: self.exit(2, ‘No minions found to gather docs from\n‘) if isinstance(ret, str): self.exit(2, ‘{0}\n‘.format(ret)) for host in ret: for fun in ret[host]: if fun not in docs: if ret[host][fun]: docs[fun] = ret[host][fun] for fun in sorted(docs): salt.output.display_output(fun + ‘:‘, ‘text‘, self.config) print(docs[fun]) print(‘‘)
salt --help 查看帮助信息
salt ‘*‘ test.ping
时间: 2024-10-11 11:18:53