linux salt命令 -e,salt命令源码分析

/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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值