Devstack 因 openstackclient.shell 异常 raised:python-neutronclient 而失败

Devstack failed with openstackclient.shell Exception raised:python-neutronclient

最近我 运行 在尝试 devstack 时遇到了这个错误:

ERROR: openstackclient.shell Exception raised: python-neutronclient 2.3.9.40.g9ed73c0 is installed but python-neutronclient<3,>=2.3.6 is required by []

我做了一些调查,发现它可能是由 python 路径问题引起的。 /opt/stack/目录下和/usr/local/lib/python2.7/dist-packages下有两套openstack客户端安装(如python-neutronclient、python-novaclient等)目录。以neutronclient为例,我可以在这两个目录下找到:

/opt/stack/python-neutronclient

/user/local/lib/python2.7/dist-packages/python-neutronclient

我发现 python 会使用安装在 /opt/stack 下的客户端:

>>> sys.path
['', '/opt/stack/python-keystoneclient', '/opt/stack/python-glanceclient', ..., '/opt/stack/heat', '/opt/stack/tempest', '/usr/lib/python2.7'....]

为什么python(devstack) 不使用/usr/local/lib/python2.7 下的包? /opt/stack下的包有问题:egg-info/PKG-INFO里的版本信息不是合法的PEP440版本,比如'2.3.10.dev47.g11deb7f',会导致devstack failed with配置 keystone 时出现上述错误:

我不记得我明确设置了 PYTHONPATH 变量。 python 或 devstack 如何在默认系统 python 路径之前设置 /opt/stack/?我检查了 devstack 源代码,但没有找到任何有用的信息。任何人都可以帮忙提供一些提示吗?谢谢!

我发现 /usr/local/lib/python2.7/dist-packages 下有一些 *.pth 文件,其中一个包含一些指向 devstack 默认目录的项目(即 /opt/stack/python-neutronclient,等等在)。这就是为什么将这些目录作为 python 路径的一部分的原因。还有一些 egg-link 文件指向 /opt/stack 下的 openstack 客户端项目文件夹,例如

~$ cat /usr/local/lib/python2.7/dist-package/python-neutronclient.egg-link
/opt/stack/python-neutronclient

所以删除那些 egg link 文件,并从 *.pth 中删除不需要的路径项,然后问题就会得到解决。请注意,您可能会将安装在 /user/local/lib/python2.7/dist-packages 下的 openstack 客户端软件包更新到最新版本。您可以通过手动执行 'pip install' 或 'apt-get' 或在 devstack 中相应地设置 'LIBS_FROM_GIT' 来完成此操作,例如:

LIBS_FROM_GIT=python-neutronclient,neutron-vpnaas,neutron-fwaas,neutron-lbaas,python-keystoneclient,python-glanceclient,python-novaclient,python-cinderclient

因此 devstack 将 git 将这些 openstack 客户端项目克隆到 /opt/stack(默认情况下),然后将这些包安装到 /usr/local/lib/python2.7/dist-packages.