openstack 基础库之 oslo_config

oslo_config 官方示例

  • 编写配置 groupoption
  • 引用 oslo_config 包的 cfg 模块,模块初始化好了一个变量 CONF ,这变量是在模块被导入时初始化的。
  • 调用 CONFapi 对配置 groupoption 进行注册
  • 调用 CONF__call__ 方法对命令行参数(指定配置文件的位置)进行解析
  • 这样以后,配置文件的值便已经注入到了这个对象 CONF
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    import sys

    # Load up the cfg module, which contains all the classes and methods
    # you'll need.
    from oslo_config import cfg

    # Define an option group
    grp = cfg.OptGroup('mygroup')

    # Define a couple of options
    opts = [cfg.StrOpt('option1'),
    cfg.IntOpt('option2', default=42)]

    # Register your config group
    cfg.CONF.register_group(grp)

    # Register your options within the config group
    cfg.CONF.register_opts(opts, group=grp)

    # Process command line arguments. The arguments tell CONF where to
    # find your config file, which it loads and parses to populate itself.
    cfg.CONF(sys.argv[1:])

    # Now you can access the values from the config file as
    # CONF.<group>.<opt>
    print("The value of option1 is %s" % cfg.CONF.mygroup.option1)
    print("The value of option2 is %d" % cfg.CONF.mygroup.option2)
  • 准备一个配置文件
    1
    2
    3
    4
    [mygroup]
    option1 = foo
    # Comment out option2 to test the default value
    # option2 = 123
  • 调用方式: python config.py --config-file test.conf

    思考

    如果 oslo_config.cfg 模块被多次导入,CONF 变量会被多次初始化么?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    # foo/bar.py
    print("bar module be imported!")

    # main.py
    from foo import bar
    from foo import bar

    # 输出
    bar module be imported!
  • 由于有 sys.modules 的存在,当你导入一个已导入的模块时,实际上是没有效果的。

    nova 组件使用

  • nova.conf 这个 pacekage 用来注册 nova 组件的所有配置项
  • CONF 单例对象在包被导入时被引用,实现方式是使用 package 根目录下的 __init__ 方法
    1
    CONF = cfg.CONF
  • 然后同样的调用单例对象的 apigroupoptions 进行注册
    1
    2
    3
    4
    5
    6
    7
    api.register_opts(CONF)
    availability_zone.register_opts(CONF)
    base.register_opts(CONF)
    cache.register_opts(CONF)
    cinder.register_opts(CONF)
    compute.register_opts(CONF)
    ...
  • nova 将不同 groupoptions 放置 nova.config 包下的不同模块中
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    cd nova/conf
    tree .

    .
    ├── api.py
    ├── availability_zone.py
    ├── base.py
    ├── cache.py
    ├── cinder.py
    ├── compute.py
    ├── conductor.py
    ├── configdrive.py
  • 最后在启动服务时使用,例如 nova-api 启动,启动服务时会指定配置文件的地址
    1
    2
    3
    4
    5
    6
    CONF = nova.conf.CONF


    def main():
    config.parse_args(sys.argv) # 启动服务时会指定配置文件的路径
    logging.setup(CONF, "nova") # CONF 加载完毕开始使用

    cli

  • 可以使用 oslo-config-generator查看服务有哪些配置
  • 例1:查看 log 相关配置
    1
    oslo-config-generator --namespace oslo.log
  • 例2:查看 nova 有哪些配置
    1
    oslo-config-generator --namespace nova.conf

openstack 基础库之 oslo_config
http://mybestcheng.site/2023/08/29/openstack/oslo/config/
作者
mybestcheng
发布于
2023年8月30日
许可协议