OpenStack配置解析庫oslo.config的使用方法


  OpenStack的oslo項目旨在獨立出系統中可重用的基礎功能,oslo.config就是其中一個被廣泛使用的庫,該項工作的主要目的就是解析OpenStack中命令行(CLI)或配置文件(.conf)中的配置信息。

  在本文的語境下,有這么幾個概念:

  配置文件:  

    用來配置OpenStack各個服務的ini風格的配置文件,通常以.conf結尾;

  配置項(options):   

    配置文件或命令行中給出的配置信息的左值, 如:enabled_apis = ec2, osapi_keystone, osapi_compute中的“enabled_apis”;

  配置項的值:    

    配置文件或命令行中給出的配置信息的右值,如:enabled_apis = ec2, osapi_keystone, osapi_compute中的“ec2, osapi_keystone, osapi_compute”;

  配置組(option groups):   

    一組配置項,在配置文件中通過[...]來表示,如my.conf文件中的[rabbit]字段表示接下來開始一個名為rabbit的配置組;

  其他模塊:  

    運行時需要根據配置項的值實現具體操作的模塊;

  配置項的模式(option schemas):

    在解析配置文件、獲取配置項的值之前,其他模塊聲明自己需要的配置項。配置文件通常是針對一個完整的服務的,因此其他模塊中可能用不到配置文件中的所有配置項,這樣就必須告訴系統自己依賴於哪些配置項,這個過程就是設置配置項的模式。包括聲明配置項在配置文件的名稱、設置配置項的默認值(一旦配置文件中沒有該配置項而其他模塊又依賴於該配置項,就使用這里聲明的默認值)等等;

  引用(reference):    

    其他模塊解析配置文件,獲取配置項的值后,就可以在下面的實現中使用這些具體的配置值了;

  注冊(register):    

    其他模塊在引用配置項的值之前,必須注冊自己將要引用的那些配置項的模式。也就是說,配置文件中的配置項其他模塊不一定都為其聲明模式,聲明了模式的配置項也不一定為其進行注冊,當然如果不注冊,即使聲明了模式,也無法引用。

 

  下面先給一個high-level的過程說明一下如何使用這個庫,OpenStack中配置文件的解析主要有以下幾個步驟:

  step1. 正確配置各個服務主配置文件(*.conf文件),本步驟在各個服務(如:keystone)中完成。

  step2. 在要使用到配置信息的模塊中聲明將用到的那些配置項的模式,包括配置項的名稱、數據類型、默認值和說明等;

  step3. 創建一個對象,創建該對象的類充當配置管理器,這個對象作為容器以后將存儲配置項的值。

  step4. 調用step3創建的對象中相應的注冊方法(如:register_opt()),注冊step2中聲明的配置項模式。這個過程不會解析配置文件,只是為step3中創建的對象開辟相應的字段。

  step5. 直接調用step3中創建的對象,傳入配置文件路徑等信息。此時將會解析配置文件,如果未指定配置文件則全部使用step2模式中的默認值。解析過程會提取step4中注冊了的配置項的值,然后這些配置項就作為step3創建的對象的屬性可以被直接引用。

  

  一個完整的實例如下:

  我們使用my.conf來存放所有的配置信息,使用config.py來表示一個依賴於my.conf中配置信息的模其他模塊。

  先設置my.conf文件,在oslo.config語境下,[DEFAULT]字段不可省略。 

#-*-coding:utf-8-*-
# my.conf

[DEFAULT]
#[DEFAULT]不可省略
enabled_apis = ec2, osapi_keystone, osapi_compute
bind_host = 196.168.1.111
bind_port = 9999

[rabbit]
host = 127.0.0.1
port = 12345
use_ssl=true
user_id = guest
password = guest

  接着寫一個腳本文件config.py,該腳本的功能非常簡單,直接執行時打印該腳本使用到的配置項的值。

#-*-coding:utf-8-*-
# config.py
# Author: D. Wang

from oslo.config import cfg
# 聲明配置項模式
# 單個配置項模式
enabled_apis_opt = cfg.ListOpt('enabled_apis',
                                   default=['ec2', 'osapi_compute'],
                                   help='List of APIs to enable by default.')
# 多個配置項組成一個模式
common_opts = [
        cfg.StrOpt('bind_host',
                   default='0.0.0.0',
                   help='IP address to listen on.'),
               
        cfg.IntOpt('bind_port',
                   default=9292,
                   help='Port number to listen on.')
    ]
# 配置組
rabbit_group = cfg.OptGroup(
    name='rabbit', 
    title='RabbitMQ options'
)
# 配置組中的模式,通常以配置組的名稱為前綴(非必須)
rabbit_ssl_opt = cfg.BoolOpt('use_ssl',
                             default=False,
                             help='use ssl for connection') 
# 配置組中的多配置項模式 
rabbit_Opts = [
    cfg.StrOpt('host',
                  default='localhost',
                  help='IP/hostname to listen on.'),
    cfg.IntOpt('port',
                 default=5672,
                 help='Port number to listen on.')
]

# 創建對象CONF,用來充當容器
CONF = cfg.CONF
# 注冊單個配置項模式
CONF.register_opt(enabled_apis_opt)

# 注冊含有多個配置項的模式
CONF.register_opts(common_opts)

# 配置組必須在其組件被注冊前注冊!
CONF.register_group(rabbit_group)

# 注冊配置組中含有多個配置項的模式,必須指明配置組
CONF.register_opts(rabbit_Opts, rabbit_group)

# 注冊配置組中的單配置項模式,指明配置組
CONF.register_opt(rabbit_ssl_opt, rabbit_group)

# 接下來打印使用配置項的值
if __name__ =="__main__":
# 調用容器對象,傳入要解析的文件(可以多個) 
  CONF(default_config_files=['my.conf'])
    
    for i in CONF.enabled_apis:
        print ("DEFAULT.enabled_apis: " + i)
    
    print("DEFAULT.bind_host: " + CONF.bind_host)
    print ("DEFAULT.bind_port: " + str(CONF.bind_port))
    print("rabbit.use_ssl: "+ str(CONF.rabbit.use_ssl))
    print("rabbit.host: " + CONF.rabbit.host)
    print("rabbit.port: " + str(CONF.rabbit.port))

  執行config.py,結果如下:

DEFAULT.enabled_apis: ec2
DEFAULT.enabled_apis: osapi_keystone
DEFAULT.enabled_apis: osapi_compute
DEFAULT.bind_host: 196.168.1.111
DEFAULT.bind_port: 9999
rabbit.use_ssl: True
rabbit.host: 127.0.0.1
rabbit.port: 12345

  下面的config_test.py不指定配置文件

# config_test.py

from config import CONF

if __name__ =="__main__":
#   CONF(default_config_files=['my.conf'])
    CONF()
    for i in CONF.enabled_apis:
        print ("DEFAULT.enabled_apis: " + i)
    
    print("DEFAULT.bind_host: " + CONF.bind_host)
    print ("DEFAULT.bind_port: " + str(CONF.bind_port))
    print("rabbit.use_ssl: "+ str(CONF.rabbit.use_ssl))
    print("rabbit.host: " + CONF.rabbit.host)
    print("rabbit.port: " + str(CONF.rabbit.port))

  執行config_test.py比較結果差別:

DEFAULT.enabled_apis: ec2
DEFAULT.enabled_apis: osapi_compute
DEFAULT.bind_host: 0.0.0.0
DEFAULT.bind_port: 9292
rabbit.use_ssl: False
rabbit.host: localhost
rabbit.port: 5672

  可以發現,執行config.py時,成功讀取了配置項的值,而執行config_test.py時,由於沒有指定要解析的配置文件,所以使用的都是設置模式時指定的默認值。

  OpenStack的oslo.config項目提供了一種開放的配置項解析工具,可以在其上實現自己需要的命令行和配置文件解析工具,也可以直接應用到自己的項目中,本文對於oslo.config項目的使用方法就介紹到這里。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM