nova 项目中,整个项目使用 oslo.config 这个类实现的配置信息管理。首先在 nova.conf.__init__.py 中定义全局变量 CONF 并令所有组件都将自己的配置信息写入全局 config 对象 CONF 中:
from oslo_config import cfg
CONF = cfg.CONF
api.register_opts(CONF)
cells.register_opts(CONF)
cinder.register_opts(CONF)
compute.register_opts(CONF)
conductor.register_opts(CONF)
flavors.register_opts(CONF)
glance.register_opts(CONF)
keystone.register_opts(CONF)
libvirt.register_opts(CONF)
neutron.register_opts(CONF)
...
CONF 中包含了整个 nova 项目中使用到的全量配置信息。除去在项目代码中配置 CONF 外,nova 在部署系统中的一些配置信息会通过自动或者手动方式写入到 /etc/nova/ 下的一些配置文件中:
api-paste.ini
nova.conf
nova-api-uswgi.ini
placement-uwsgi.ini
nova-cpu.ini
nova-metadata-uwsgi.ini
其中 nova.conf 中包含了组件级别的重要配置信息:
instances_path = /opt/stack/data/nova/instances
state_path = /opt/stack/data/nova
enabled_apis = osapi_compute
metadata_listen = 0.0.0.0
osapi_compute_listen = 0.0.0.0
instance_name_template = instance-%08x
my_ip = 10.170.0.6
default_floating_pool = public
rootwrap_config = /etc/nova/rootwrap.conf
allow_resize_to_same_host = True
debug = True
[wsgi]
api_paste_config = /etc/nova/api-paste.ini
[scheduler]
driver = filter_scheduler
[filter_scheduler]
track_instance_changes = False
enabled_filters = RetryFilter,AvailabilityZoneFilter,ComputeFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter,Ser
verGroupAntiAffinityFilter,ServerGroupAffinityFilter,SameHostFilter,DifferentHostFilter
[key_manager]
fixed_key = c09b7ee1b81d354aba584a81a4d6b5a5f93b2e8089228717597d5f7192695b5c20cea2df
api_class = nova.keymgr.conf_key_mgr.ConfKeyManager
[database]
connection = mysql+pymysql://root:passwd@127.0.0.1/nova_cell0?charset=utf8
[api_database]
connection = mysql+pymysql://root:passwd@127.0.0.1/nova_api?charset=utf8
这些信息可手动配置,也可由自动化脚本生成。在 devstack 中,对于每个服务,在 devstack/lib 下有对应的 shell 脚本实现服务的自动化配置和启动关停。
每个服务的shell脚本都包括以下几个过程(以 nova 为例):
# - install_nova
# - configure_nova
# - create_nova_conf
# - init_nova
# - start_nova
# - stop_nova
# - cleanup_nova
以上步骤将被 stack.sh 和 unstack.sh 调用执行。
回到关于 CONF 的配置问题,除了在项目python代码中配置外,在 /etc/nova/nova.conf 配置文件中的重要配置信息将会在相应的服务在以命令行方式启动时,以 nova-cpu 为例,以命令行参数传递给服务程序:
run_process n-cpu "$NOVA_BIN_DIR/nova-compute --config-file $NOVA_CPU_CONF"
其中$NOVA_CPU_CONF
为路径 /etc/nova/nova-cpu.conf
。而在启动 nova-api 服务的 nova.cmd.api 中,将执行:
...
config.parse_args(sys.argv)
...
进而调用 config.py 将命令行参数注册到 CONF 对象中:
...
CONF(argv[1:],
project='nova',
version=version.version_string(),
default_config_files=default_config_files)
...
最终实现配置信息的获取,得到配置信息对象 CONF
。