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

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

  在本文的語境下,有這麼幾個概念:工具

  配置文件:  spa

    用來配置OpenStack各個服務的ini風格的配置文件,一般以.conf結尾;命令行

  配置項(options):   code

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

  配置項的值:    utf-8

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

  配置組(option groups):   ci

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

  其餘模塊:  

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

  配置項的模式(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]字段不可省略。 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

#-*-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,該腳本的功能很是簡單,直接執行時打印該腳本使用到的配置項的值。

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

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

#-*-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,結果以下:

1

2

3

4

5

6

7

8

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不指定配置文件

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

# 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比較結果差異:

1

2

3

4

5

6

7

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項目的使用方法就介紹到這裏。

相關文章
相關標籤/搜索