基于老版本自己改写的一个sample文件生成脚本
nova老版本(我之前用的是H版本)的nova.conf.sample文件生成使用的是一个shell脚本和几个python脚本,其中python脚本又依赖了common目录下的几个py文件,我这边改写了一下,把依赖提取到统一的py文件里面,形成了一个通用的sample文件生成脚本,可以继续用在基于oslo.config库进行配置管理的代码项目中,但有一个缺点,就是使用到的第三方库比如oslo.log,它也用到了oslo.config管理配置,我的这个脚本不能把里面的配置生成出来(debug=True这种配置就丢了),也懒得改了。
代码在这里:https://github.com/aspirer/scripts/tree/master/generate_sample
为啥要写这个,原因就是折腾了好久的oslo-config-generator都没折腾好,配置模板的内容一直为空,不过后来同事又折腾了一次,参考OpenStack senlin项目,总算折腾好了,下面会介绍问题出在哪里。
oslo-config-generator
参考:https://docs.openstack.org/oslo.config/latest/cli/generator.html
之前一直生成不成功,没有内容,是因为没有实现list_opts方法,貌似之前看官方文档的时候没看到这段,也可能是我忽视了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
from oslo_config import cfg opts1 = [ cfg.StrOpt('foo'), cfg.StrOpt('bar'), ] opts2 = [ cfg.StrOpt('baz'), ] baz_group = cfg.OptGroup(name='baz_group' title='Baz group options', help='Baz group help text') cfg.CONF.register_group(baz_group) cfg.CONF.register_opts(opts1, group='blaa') cfg.CONF.register_opts(opts2, group=baz_group) def list_opts(): # Allows the generation of the help text for # the baz_group OptGroup object. No help # text is generated for the 'blaa' group. return [('blaa', opts1), (baz_group, opts2)] |
也可以用yield来替代return的list,多个opt的话就写多行(参考的senlin项目):
1 2 3 4 |
CONF.register_opts(global_opts) def list_opts(): yield 'DEFAULT', global_opts |
另外还需要注意namespace问题,namespace是用来指定你的list_opts的路径的,一个项目可以有多个namespace,也可以只有一个,看你怎么实现的配置管理了(所有配置项都放在一个py文件里就一个namespace就够了,分开放可能要多个),可以配置在setup.cfg或setup.py的entry_points里面,具体参考官方文档就行了,使用命令生成的时候注意加上所有的namespace,或者加上oslo-config-generator的namespace配置文件。
另外还有一个问题要提示一下,虽然我们实验成功了,但发现它对中文配置项的支持不太友好,举例,两个模块里面定义了两个类似的StrOpt配置项,default、help都有中文(name是英文),生成的配置示例文件中,一个模块的中文配置的default、help都可以正常生成,但另外一个死活不行,把能生成的配置的default和help拷贝到有问题的配置项那里,还是一样无法生成,报编码错误,因此只能继续使用我上面那个改写的脚本,那个是都可以生成的。