/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
salt可以使用shell通配符对目标minion进行匹配
salt '*qa*' test.ping
salt 'gintama-q?-server' test.ping
salt -E,--prce 使用prce正则表达式对目标minion进行匹配
salt -E '(gintama|jialebi)-qa-server' test.ping