OpenStackで設定ファイル周りを簡単に操作するために開発、利用されているoslo.config。
参照する設定ファイルをcliのオプションで指定しなかった場合、規定のフォルダから、決められたファイル名で設定ファイルを検索してくれる。
フォルダはまず以下の順番で参照される。(https://github.com/openstack/oslo.config/blob/2.5.0/oslo_config/cfg.py#L498 _get_config_dirs関数)
~/.${project}/
~/
/etc/${project}/
/etc/
${project}
は初期化時に指定した値。
以下のように指定していた場合、~/.foo/
等から検索される。
from oslo.config import cfg
def init_oslo_config():
cfg.CONF(project='foo')
ファイル名は以下のものか検索される。(https://github.com/openstack/oslo.config/blob/2.5.0/oslo_config/cfg.py#L542 find_config_files関数)
${project}.conf
${prog}.conf
${project}
は上と同じで、${prog}
はコレもまた、初期化時に指定するもの。
from oslo.config import cfg
def init_oslo_config():
cfg.CONF(project='foo', prog='bar')
ただし、初期化時にprogを指定していなかった場合はプロセス名( os.path.basename(sys.argv[0])
)が${prog}
となる。
参照のルールは、
- ファイルは両方参照する
- 検索するファイル名で上記フォルダを順番にさがす。
例えば、${project}
がfoo, ${prog}
がbarで以下のようにファイルが存在する場合、設定ファイルとして参照されるのは/etc/foo/foo.conf
, ~/bar.conf
になる。
~/bar.conf
/etc/foo/foo.conf
/etc/foo/bar.conf
/etc/foo.conf
/etc/bar.conf
この挙動は以下のようにして確認が出来るので、想定外の設定ファイルが参照されている場合にやってみると良い。
from oslo.config import cfg
print cfg.find_config_files('foo', 'bar')
参照された設定ファイルに同じオプションが指定されている場合、${prog}
が優先される。読み込まれる設定ファイルは後勝ちであり、${project}
, ${prog}
の順に参照されるため。
ただし、これらのファイルはプロセス起動時のパラメータに--config-file
を一つでも指定していると使われない。