ceph-deploy是ceph部署集群的工具。其源码在https://github.com/ceph/ceph-deploy
script 目录下的ceph-deploy是ceph-deploy的入口函数
#!/usr/bin/env python
import os
import platform
import sys
"""
ceph-deploy - admin tool for ceph
"""
if os.path.exists('/usr/share/pyshared/ceph_deploy'):
sys.path.insert(0,'/usr/share/pyshared/ceph_deploy')
elif os.path.exists('/usr/share/ceph-deploy'):
sys.path.insert(0,'/usr/share/ceph-deploy')
elif os.path.exists('/usr/share/pyshared/ceph-deploy'):
sys.path.insert(0,'/usr/share/pyshared/ceph-deploy')
elif os.path.exists('/usr/lib/python2.6/site-packages/ceph_deploy'):
sys.path.insert(0,'/usr/lib/python2.6/site-packages/ceph_deploy')
from ceph_deploy.cli import main
if __name__ == '__main__':
sys.exit(main())
可见这里会调用ceph-deploy-master\ceph_deploy\cli.py下的main函数
def main(args=None, namespace=None):
try:
_main(args=args, namespace=namespace)
finally:
# This block is crucial to avoid having issues with
# Python spitting non-sense thread exceptions. We have already
# handled what we could, so close stderr and stdout.
if not os.environ.get('CEPH_DEPLOY_TEST'):
try:
sys.stdout.close()
except:
pass
try:
sys.stderr.close()
except:
pass
继续调用_main 函数
@catches((KeyboardInterrupt, RuntimeError, exc.DeployError,), handle_all=True)
def _main(args=None, namespace=None):
# Set console logging first with some defaults, to prevent having exceptions
# before hitting logging configuration. The defaults can/will get overridden
# later.
# Console Logger
//得到向命令行输出log的handle,然后用颜色表示不同的log level,设置默认的log级别为warning
sh = logging.StreamHandler()
sh.setFormatter(log.color_format())
sh.setLevel(logging.WARNING)
# because we're in a module already, __name__ is not the ancestor of
# the rest of the package; use the root as the logger for everyone
//得到root_logger,然后会将前面设置的命令行hander sh添加到root_logger中,这样控制台就可以输出log了
root_logger = logging.getLogger()
# allow all levels at root_logger, handlers control individual levels
root_logger.setLevel(logging.DEBUG)
root_logger.addHandler(sh)
//得到解析cli的parser,成功得到后调用parser.parse_args解析cli
parser = get_parser()
if len(sys.argv) < 2:
parser.print_help()
sys.exit()
else:
//args 代表解析cli后得到的结果
args = parser.parse_args(args=args, namespace=namespace)
//根据cli中是否加quiet 来决定是否修改控制台的log level
console_loglevel = logging.DEBUG # start at DEBUG for now
if args.quiet:
console_loglevel = logging.WARNING
if args.verbose:
console_loglevel = logging.DEBUG
# Console Logger
sh.setLevel(console_loglevel)
//除了将log写到控制台,还会将log写到文件中,方法和控制台类似,最终通过root_logger.addHandler都要加到root_logger中
# File Logger
fh = logging.FileHandler('ceph-deploy-{cluster}.log'.format(cluster=args.cluster))
fh.setLevel(logging.DEBUG)
fh.setFormatter(logging.Formatter(log.FILE_FORMAT))
root_logger.addHandler(fh)
# Reads from the config file and sets values for the global
# flags and the given sub-command
# the one flag that will never work regardless of the config settings is
# logging because we cannot set it before hand since the logging config is
# not ready yet. This is the earliest we can do.
//加载ceph_deploy得到ceph的配置
args = ceph_deploy.conf.cephdeploy.set_overrides(args)
LOG.info("Invoked (%s): %s" % (
ceph_deploy.__version__,
' '.join(sys.argv))
)
log_flags(args)
return args.func(args)
def get_parser():
//调用argparse 模块添加ceph-depoly提供的命令。这里的argparse是python的标准库。从这里看到看到支持的cli如下所示
parser = argparse.ArgumentParser(
prog='ceph-deploy',
formatter_class=argparse.RawDescriptionHelpFormatter,
description='Easy Ceph deployment\n\n%s' % __header__,
)
verbosity = parser.add_mutually_exclusive_group(required=False)
verbosity.add_argument(
'-v', '--verbose',
action='store_true', dest='verbose', default=False,
help='be more verbose',
)
verbosity.add_argument(
'-q', '--quiet',
action='store_true', dest='quiet',
help='be less verbose',
)
parser.add_argument(
'--version',
action='version',
version='%s' % ceph_deploy.__version__,
help='the current installed version of ceph-deploy',
)
parser.add_argument(
'--username',
help='the username to connect to the remote host',
)
parser.add_argument(
'--overwrite-conf',
action='store_true',
help='overwrite an existing conf file on remote host (if present)',
)
parser.add_argument(
'--ceph-conf',
dest='ceph_conf',
help='use (or reuse) a given ceph.conf file',
)
sub = parser.add_subparsers(
title='commands',
metavar='COMMAND',
help='description',
)
sub.required = True
//得到cli的入口
entry_points = [
(ep.name, ep.load())
for ep in pkg_resources.iter_entry_points('ceph_deploy.cli')
]
//根据priority 排序
entry_points.sort(
key=lambda name_fn: getattr(name_fn[1], 'priority', 100),
)
for (name, fn) in entry_points:
p = sub.add_parser(
name,
description=fn.__doc__,
help=fn.__doc__,
)
if not os.environ.get('CEPH_DEPLOY_TEST'):
p.set_defaults(cd_conf=ceph_deploy.conf.cephdeploy.load())
# flag if the default release is being used
p.set_defaults(default_release=False)
fn(p)
p.required = True
parser.set_defaults(
cluster='ceph',
)
return parser
ceph-deploy的入口函数
最新推荐文章于 2024-05-06 10:45:38 发布