packstack总体流程分析(2)本文回答这两个问题:这些create_xxx_manifest是由哪里来调用的?/var/tmp/packstack/xxx/xxx.pp是如何被执行的? (1)各plugins中的create_xxx_mainfest是如何被调用的?def initPluginsSequences():
for plugin incontroller.getAllPlugins():
plugin.initSequences(controller)在initPluginsSequences中,会去调用所有plugins.xxx.py中的initSequences 其中plugin就是一个plugins.xxx.py文件,比如cinder_250.py,nova_300.py(2)某个plugin中的initSequences的一个例子:比如plugins/cinder_250.py中的initSequences:def initSequences(controller):
config = controller.CONF
if config['CONFIG_CINDER_INSTALL'] != 'y':
return
config['CONFIG_CINDER_BACKEND'] = (
[i.strip() for i in config['CONFIG_CINDER_BACKEND'].split(',') if i]
)
for key in ('CONFIG_CINDER_NETAPP_VOLUME_LIST',
'CONFIG_CINDER_GLUSTER_MOUNTS',
'CONFIG_CINDER_NFS_MOUNTS'):
if key in config:
config[key] = [i.strip() for i in config[key].split(',') if i]
cinder_steps = [
{'title': 'Adding Cinder Keystone manifest entries',
'functions': [create_keystone_manifest]}
]
if 'lvm' in config['CONFIG_CINDER_BACKEND']:
cinder_steps.append(
{'title': 'Checking if the Cinder server has a cinder-volumes vg',
'functions': [check_cinder_vg]})
cinder_steps.append(
{'title': 'Adding Cinder manifest entries',
'functions': [create_manifest]}
)
controller.addSequence("Installing OpenStack Cinder", [], [], cinder_steps)(3)functions的执行:生成/var/tmp/packstack/xxx/xxx.pp文件,即生成puppet文件def runSequences():controller.runAllSequences()如果function不是plugins.puppet_xxx.py中的,那么会调用create_xxx_manitest()生成host_ip_plugin.pp,比如192.168.129.130_cinder.pp如果function是plugins.puppet_xxx.py中的,那么会调用puppet apply来执行这些puppet,来做实际的部署工作。 (4)调用各plugins/xxx.py:create_xxx_manifest的流程生成puppet文件,以及这些puppet文件被最终执行的流程如下: installer.run_setup.py:main()->installer.run_setup.py:_main()->installer.run_setup.py:_main():initPluginsSequences()
->installer.run_setup.py: initPluginsSequences()
->plugins.cinder_xxx.py: initSequences()
->plugins.nova_xxx.py: initSequences()
->plugins.puppet_xxx.py:initSequences()->installer.run_setup.py:_main():runSequences()
->installer.setup_controller.py: runAllSequences()
->installer.core.sequences.py: Sequence.run()
->installer.core.sequences.py: Step.run()
->plugins.xxx.py:在initSequences中初始化的functions
->if not puppet_xxx.py:
->appendManifestFile:生成host_ip_cinder.pp,目录在/var/tmp/packstac/uuid/下
->if puppet_xxx.py:
-> plugins.puppet.initSequences()会将apply_puppet_manifest这一function加入到sequence中
-> plugins.puppet.apply_puppet_manifest()调用puppet apply,执行这些puppet脚本