nova读取配置文件流程

本文详细介绍了OpenStack Nova服务在启动时如何读取配置文件的过程,包括通过命令行选项`--config-file`指定配置文件以及在特定目录下自动搜索配置文件的顺序。在启动 nova-compute 服务时,分析了配置文件的读取路径和优先级。通过源代码分析,阐述了nova如何解析命令行参数和配置文件,以及如何获取配置项的值。文章还提及了配置文件的结构和解析规则,帮助读者理解配置文件的编辑规范和Nova服务的配置机制。
摘要由CSDN通过智能技术生成

      在我们安装nova的过程中,设置它的配置文件/etc/nova/nova.conf是必不可少的一步。配置好nova.conf文件,nova-compute、nova-network等服务才有可能正常启动。当然在修改nova.conf文件后,必须重启nova的所有服务,新的配置才能生效。
      其实我们的配置文件不一定非要存放为/etc/nova/nova.conf,也可以设置成任意目录下的任意文件。nova获取配置文件的方式有两种:
1、通过命令行 选项 --config-file 指定 任意文件为配置文件(当然前提是有读写权限)
例如:  /usr/bin/python /usr/bin/nova-compute--config-file=/etc/nova/nova.conf--config-file=/etc/nova/nova-compute.conf
      通过--config-file选项,可以指定任意多个配置文件,上例给nova-compute服务指定了两个配置文件。此时,在这两个文件设置的配置项,都是有效的。但如果这两个文件有相同的配置项,而且这个配置项是不允许有多个值的,那会以哪个为有效指呢,还是会出现错误?
2、如果在服务启动时,没有通过--config-file指定配置文件,那么nova会在几个特定的目录按照先后顺序下寻找配置文件。在每个服务启动时,会按照以下顺序寻找配置文件:
[~/.nova/, ~/, /etc/nova/,/etc/]
例如,启动nova-compute时,它会在这些目录下分别寻找nova.conf和nova-compute.conf,如果~/.nova/nova.conf存在,那么就不会再寻找其它目录下的nova.conf了。对于nova-compute.conf文件也是一样。

nova配置文件内容格式如下:
[DEFAULT]
dhcpbridge_flagfile=/etc/nova/nova.conf
dhcpbridge=/usr/bin/nova-dhcpbridge
libvirt_use_virtio_for_bridges=True
connection_type=libvirt
...…
分析

    下文用于分析nova组件是如何读取命令行和文件配置,从分析流程中我们可以知道:
1)nova是如何寻找配置文件,配置文件存放在哪个目录下才能被它读取
2)配置文件的编辑应该遵守什么样的格式,才能被nova正常读取
3)当我们需要在配置文件中添加一个我们自己的选项时,我们应该在哪些地方进行如何修改,才能被nova获取到我们写入配置文件的值

nova有多个服务:nova-cert、nova-consoleauth、nova-manage、nova-novncproxy、nova-scheduler、 nova-api、nova-compute、nova-dhcpbridge、nova-network、nova-rootwrap。各个服务在启动时,读取配置文件的流程都是一样的。下面针对nova-compute的配置读取过程进行分析,其他的服务相同。

compute启动脚本
/usr/bin/nova-compute文件:
  42 if __name__ == '__main__':
  43     flags.parse_args(sys.argv)
  44     logging.setup('nova')
  45     utils.monkey_patch()
  46     server = service.Service.create(binary='nova-compute')
  47     service.serve(server)
  48     service.wait()

第42行调用flags.parse_args(sys.argv)函数,该函数定义于nova/flags.py。它调用CommonConfigOpts实例进行命令行参数和配置文件的读取:
nova/flags.py:
  36 FLAGS = cfg.CONF
  37 
  38 
  39 def parse_args(argv,default_config_files=None):
  40     FLAGS.disable_interspersed_args()
  41     return argv[:1] + FLAGS(argv[1:],
  42                             project='nova',
  43                             default_config_files=default_config_files)

继续查看cfg.CONF
/nova/openstack/common/cfg.py
1654  CONF =CommonConfigOpts()

    由上面代码可知,nova-compute后面的命令行参数直接调用CommonConfigOpts对象处理,并设project=‘nova’,默认配置文件为空。 CommonConfigOpts乃何许类也,它都干些什么呢?
      CommonConfigOpts是ConfigOpts的子类,而在ConfigOpts中定义__call__函数,所以CommonConfigOpts对象可以像函数一样,被直接调用。为了能够理解这两个类是干什么的,我们需要先了解另外几个类:

optparse.OptionParser
optparser库中的OptionParser,用来解析通过命令行指定的参数,该库目前不再更新,将会被argparser代替。但openstack使用该库来解析,所以做个简单介绍:

from optparse import OptionParser

parser = OptionParser()
parser.add_option("-f", "--file", dest="filename",#dest用来明确指定解析参数后对应的属性名,
                                                                                  #如果没有指定则为file
                  help="write report to FILE", metavar="FILE")
parser.add_option("-q", "--quiet",
                  action="store_false", dest="verbose", default=True,
                  help="don't print status messages to stdout")

(options, args) = parser.parse_args(['-f', 'test.txt', 'ddd','ffff'])
该脚本执行过后,options.filename=test.txt、options.verbose=True。args=[ 'ddd','ffff'],它是用于返回不能被OptionParser识别的参数。

optparse.OptionGroup
当参数较多时,可利用OptionGroup对其进行分类,这样在输出help信息时,能够分类整齐些,所以每一个OptionGroup都必须与一个OptionParser关联(多对一的关系)。在使用上,与OptionParser差不多。如下:
group = OptionGroup(parser, "Dangerous Options",#其中parser为上面定义的类
                    "Caution: use these options at your own risk.  "
             
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值