openstack 配置文件的读取

转载 2013年12月02日 14:53:24

http://pudge.cn/2013/03/16/openstack-%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E7%9A%84%E8%AF%BB%E5%8F%96/

前段时间, 阅读了openstack E版本源码中关于配置文件读取下面对配置文件的读取做一个总结(注现在openstack关于配置文件不再是common中的cfg.py 文件, 而是独立实现了一个包oslo-config):
首先对openstack配置项做一个介绍,
我们以compute.manager 为例:

  1. compute_opts = [
  2. cfg.StrOpt('instances_path',
  3. default='$state_path/instances',
  4. help='where instances are stored on disk'),
  5. ……………………
  6. 上面申明了配置项
  7. FLAGS = flags.FLAGS
  8. FLAGS.register_opts(compute_opts) #会把值注册到cfg.ConfigOpts 中的opts属性中

现在在compute.manager.py中就可以通过FLAGS.instances_path 读取到配置项instance_path的值

通过FLAGS.instances_path 读取的逻辑如下
1: FLAGS = cfg.CONF
2: CONF = CommonConfigOpts()
这样可知这次调用会调用CommonCOnfigOpts.__getattr__()
这里会读取到config.opts。

上面是读取代码default 配置的值, 那么是怎样读取配置文件的呢?
首先我们应该知道是在哪里注入配置文件的:
下面以nova.conf 为例:
在启动nova-compute(不仅仅是compute服务所有的nova服务是一样的), 会调用bin/ 下面的文件 nova-compute 文件, 下面是执行的主要逻辑

  1. if __name__ == '__main__':
  2. flags.parse_args(sys.argv)
  3. logging.setup('nova')
  4. utils.monkey_patch()
  5. server = service.Service.create(binary='nova-compute')
  6. service.serve(server)
  7. service.wait()
  1. def parse_args(argv, default_config_files=None):
  2. FLAGS.disable_interspersed_args()
  3. return argv[:1] + FLAGS(argv[1:],
  4. project='nova',
  5. default_config_files=default_config_files)

flags.parse_args(sys.argv)中会把配置文件转化到内存 , 这里我们可以通过--config-file 指定配置文件的路径, 但是在实际转化中
他会到当前用户的工作目录, 以及/etc/nova 或者/etc/ 中需找nova.conf, nova-compute.conf 文件如果找到这个文件那么他会把值转化到
ConfigParser.sections 中

  1. def assignment(self, key, value):
  2. if not self.section:
  3. raise self.error_no_section()
  4.  
  5. self.sections[self.section].setdefault(key, [])
  6. self.sections[self.section][key].append('\n'.join(value))

在上面读取配置文件中先读取ConfigOpts 中的opts 如果没有这个key那么会报错, 如果存在那么会然后检索ConfigParser.sections 如果存在那么会覆盖掉opts中
的值。这样就读取到配置文件的value了。

下面是我的一个测试代码,这里调用了oslo-config(就是对e,f 版本中cfg文件的封装)包,

  1. from oslo.config import cfg
  2. import sys
  3.  
  4. test_opts = [
  5. cfg.StrOpt('topic',
  6. default='this is a test value',
  7. help='this is a test config'),
  8. cfg.StrOpt('say',
  9. default='world',
  10. help=' jkjk ')
  11. ]
  12.  
  13.  
  14. def parse_argv(argv, default_config_files=None):
  15. cfg.CONF(argv[1:], project='test',
  16. default_config_files=default_config_files)
  17.  
  18. def test(argv):
  19.  
  20. CONF=cfg.CONF
  21. CONF.register_opts(test_opts)
  22.  
  23. parse_argv(argv)
  24.  
  25. print CONF.topic+“ ”+CONF.say
  26.  
  27. if __name__ == "__main__":
  28. test(sys.argv)

那么你可以创建一个配置文件test.conf 内容如下

  1. [default]
  2. topic="test-topic"

运行结果如下:

test-topic world


在Oslo的cfg模块载入的时候(from Oslo.config import cfg),会自动运行模块中的载入代码CONF = ConfigOpts(),创建一个全局的配置项管理类。

和许多Conf配置模块一样,Oslo.conf在使用时,需要先声明配置项的名称、定义类型、帮助文字、缺省值等,然后再按照事先声明的配置项,对CLI或conf中的内容进行解析。

配置项声明结构示例如下:

[python] view plaincopy
  1. common_opts = [  
  2.     cfg.StrOpt('bind_host',  
  3.            default='0.0.0.0',  
  4.                help='IP address to listen on'),  
  5.     cfg.IntOpt('bind_port',  
  6.                default=9292,  
  7.                help='Port number to listen on')  
  8. ]  
类型的定义对应Opt的各个子类。

Oslo使用register_opt方法,将配置项定义向配置项管理类configOpts的注册是在程序的运行时刻,但是必须在配置项的引用前完成。

[plain] view plaincopy
  1. CONF = cfg.CONF  
  2. CONF.register_opts(common_opts)  
  3.   
  4. port = CONF.bind_port  

使用conf.register_cli_opts()方法,配置项还可以在管理类ConfigOpts中可选注册为CLI配置项,通过程序运行的CLI参数中获得配置项取值,并在错误打印时,自动输出给CLI配置项参数的帮助文档。

conf配置文件采用的是ini风格的格式

[plain] view plaincopy
  1. glance-api.conf:  
  2.   [DEFAULT]  
  3.   bind_port = 9292  
  4.     ...  
  5.   
  6.   [rabbit]  
  7.   host = localhost  
  8.   port = 5672  
  9.   use_ssl = False  
  10.   userid = guest  
  11.   password = guest  
  12.   virtual_host = /  
最后通过ConfigOpts类的__call()__方法,执行配置项的解析以及从CLI或配置文件读取配置项的值。

[python] view plaincopy
  1. def __call__(self,  
  2.              args=None,  
  3.              project=None,  
  4.              prog=None,  
  5.              version=None,  
  6.              usage=None,  
  7.              default_config_files=None):  
  8.     """Parse command line arguments and config files.  
下面是一个完整的示例

[python] view plaincopy
  1. from oslo.config import cfg  
  2.   
  3. opts = [  
  4.     cfg.StrOpt('bind_host', default='0.0.0.0'),  
  5.     cfg.IntOpt('bind_port', default=9292),  
  6. ]  
  7.   
  8. CONF = cfg.CONF  
  9. CONF.register_opts(opts)  
  10. CONF(default_config_files='glance.conf')  
  11. def start(server, app):  
  12.     server.start(app, CONF.bind_port, CONF.bind_host)  

OpenStack项目的配置项声明和许多其他开源Python项目一样,配置项声明是放在各个调用的模块里面的。也就是说哪里用到才到哪里声明。我觉得这种方式是完全体现了Pthonic的一种声明方式,有别于其他方式,程序员在阅读程序的时候可以非常方便的在文件开头就能找到配置项的声明定义,而不用到某个指定的文件去查找,实现了KISS的原则。

一步步教你OpenStack安装与配置

一、引言本内容讲解如何在3台物理机上搭建最小化云平台,这3台机器分为称为Server1、Server2和Client1,之后的各章也是如此。Server1承载着Nova、Glance、Swift、Ke...

openstack源码阅读笔记2 配置与oslo_config

Openstack提取了一些在多数项目中经常使用的功能,做成了共公的包,这些公共包同样在nova中的各个服务模块大量使用。这此公共包都以oslo开头。 在分析具体代码之前,必须先熟悉这些公共包,以下先...
  • ATsuwu
  • ATsuwu
  • 2016年08月30日 00:10
  • 992

openstack (neutron)无法删除已创建的网络

最近在搭建OpenStack私有云环境,在搭建过程中遇到了很多问题,总是想记录下来但是一直没有付出行动,这两天遇到了neutron问题。        我成功创建了neutron的ext-net和s...

Neutron-server初始化 — Api服务初始化

Restful Api服务初始化api服务的实现是service.NeutronApiService,这是一个符合WSGI规范的app,通过paste进行配置。 neutron/neutron/se...

Openstack L版,最新配置文件node1

  • 2016年12月20日 14:37
  • 222KB
  • 下载

openstack_ice之wsgi详解(paste从ini配置文件->routesr具体发布流程)

对Restful API有了一个基础的了解,那么我们来看通过URL是怎样映射到具体的应用程序操作函数上了。在OpenStack中的API Daemon都会有一个Router类,来构建资源与URL直接的...

Openstack L版,最新配置文件node2

  • 2016年12月20日 14:38
  • 139KB
  • 下载

OpenStack基于修改ip和配置文件的多节点部署

OpenStack基于修改ip和配置文件的多节点部署 本文主要是提供一种新的思路。OpenStack的liberty版本比Juno更加容易部署,也使用了Linux bridge的...

轻轻修改配置文件完成 OpenStack 监控

当我们使用虚拟化云平台 OpenStack 时,必然要时时监控其虚拟机性能,随着近年企业级数据中心的不断发展,像混合虚拟化环境的业务需求也在持续增长中,因而也随之带来的监控需求更显重要,所以小编带来一...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:openstack 配置文件的读取
举报原因:
原因补充:

(最多只允许输入30个字)