使用virtualenv解决gnocchi软件依赖#

安装最新版本的gnocchi,gnocchi需要升级许多公共软件,例如oslo.config、oslo.middleware等,这样就会影响到其他组件的正常运行,利用virtualenv搭建独立的执行环境来解决此问题。

virtualenv可以搭建虚拟且独立的python环境,可以使每个项目环境与其他项目独立开来,保持环境的干净,解决包冲突问题。

1.virtualenv 安装

pip install virtualenv

或者

yum install python-virtualenv

2.创建python虚拟环境

使用virtualenv命令创建python虚拟环境:virtualenv [虚拟环境名称]。

  virtualenv gncochi-env

执行后,在本地会生成一个与虚拟环境同名的文件夹。

如果你的系统里安装有不同版本的python,可以使用–python参数指定虚拟环境的python版本:

virtualenv --python=/usr/local/python-2.7.8/bin/python2.7 gncochi-env

默认情况下虚拟环境不会依赖系统环境的global site-packages。比如系统环境里安装了MySQLdb模块,在虚拟环境里import MySQLdb会提示ImportError。如果想依赖系统环境的第三方软件包,可以使用参数–system-site-packages。

virtualenv --system-site-packages gncochi-env

3.启动虚拟环境

进入虚拟环境目录,启动虚拟环境

cd /opt/openstack/gnocchi
source gnocchi-env/bin/activate

启动虚环境其实就是利用source改变当前的环境变量

虚环境中默认有安装pip,因此可以直接用pip进行安装,在虚环境中安装的软件不会与外界环境有关联,可以安装与外界环境不同的软件版本,以供gnocchi使用。

pip install oslo.config==4.3.0;
pip install oslo.middleware==3.26.0;
pip install pbr==2.0.0;
pip install scipy==0.19.0;
...

需要注意的是在虚环境中使用yum安装的软件其实是调用外界的yum,因此安装卸载软件都是安装卸载外界环境上的软件。

4.退出虚拟环境

在虚环境中执行

deactivate

5.使用虚拟环境中的软件

在虚环境中安装好软件之后,软件依赖不会影响到外界环境,当在外部使用虚环境的可执行脚本时,只需要更改可执行脚本所在目录即可:

例如执行:

/opt/openstack/gnocchi/gnocchi-env/bin/gnocchi-upgrade

6.解决WSGI中的启动脚本

gnocchi的api启动方式目前采用的是wsgi方式启动,而不是直接调用gnocchi-api启动脚本:

<VirtualHost *:8041>
    WSGIDaemonProcess gnocchi processes=10 threads=10 user=gnocchi display-name=%{GROUP}
    WSGIProcessGroup gnocchi
    WSGIScriptAlias / /opt/openstack/gnocchi/gnocchi-env/lib/python2.7/site-packages/gnocchi/rest/app.wsgi
    WSGIApplicationGroup %{GLOBAL}
    ...
</VirtualHost>

app.wsgi中部分代码为:

import debtcollector

from gnocchi.rest import app

application = app.build_wsgi_app()

导致,在代码调用的时候找不到相关的model。这是因为执行该app.wsgi时使用的Python-path是系统默认的,并不是虚环境中的,而在外部系统并没有安装gnocchi,所以导致找到不到gnocchi.rest 该model。

解决方法:wsgi支持配置不同的Python-path(感觉wsgi还是很强大的)

<VirtualHost *:8041>
    WSGIDaemonProcess gnocchi processes=10 threads=10 user=gnocchi display-name=%{GROUP} python-path=/opt/openstack/gnocchi/gnocchi-env/lib/python2.7/site-packages
    WSGIProcessGroup gnocchi
    WSGIScriptAlias / /opt/openstack/gnocchi/gnocchi-env/lib/python2.7/site-packages/gnocchi/rest/app.wsgi
    WSGIApplicationGroup %{GLOBAL}
    ...
</VirtualHost>

这样gnocchi的两个进程都使用虚环境中的gnocchi脚本进行运行,完美解决软件版本升级依赖问题。

Table of Contents