OpenStack高可用集群(下册):部署与运维
上QQ阅读APP看书,第一时间看更新

11.1 OpenStack集群高可用离线部署

OpenStack是开源项目,用户可以通过Internet利用网络安装源进行实时部署,也可以下载源代码或者开源厂商发行的RPM安装包进行离线部署。由于网络安装源常位于国外,且国内网络环境限制,通常致使安装过程中断或者耗时较长的情况,尤其是在大规模安装环境中,这种方式显然是不明智的。此外,对于像金融、政府等行业,由于安全限制等原因,数据中心与互联网通常是隔离的,类似的企业想要部署基于OpenStack的私有云,则必须通过离线安装方式来实现。离线安装方式可以是源代码下载安装方式,也可以是类似RDO的厂商开源发行版本离线安装方式。如果采用离线源代码安装,则通常需要配置本地pip源;如果采用离线软件安装包的形式安装,则通常需要配置本地yum源。

对于多数终端用户而言,离线源代码安装方式似乎难度太大,而且要解决很多软件依赖性问题,通常仅有对OpenStack具有深入理解的用户才会使用离线源代码安装部署OpenStack。对于大多数用户,较为理想的离线安装方式便是通过互联网同步远程软件包安装源到本地,然后搭建本地共享yum源仓库,这样集群节点在部署安装时便可利用内网进行安装包的快速下载和安装。为了便于不同级别的用户参考,本节将介绍本地pip源和本地yum源的制作方式,用户可以根据自身情况选择和制作不同的本地源进行OpenStack的安装部署。

11.1.1 制作OpenStack离线安装pip源

OpenStack目前支持主流的Linux操作系统,而OpenStack主要用Python语言开发,对于Linux操作系统而言,yum是使用最为广泛的软件包安装工具。而在Python的世界里,pip在软件包的安装和依赖解决方面有着类似yum的功能,因此也是使用极为广泛的软件包安装工具。在OpenStack源代码离线安装中,通常使用pip来安装OpenStack各个项目所需的Python依赖包。OpenStack各个项目在源代码发行时,通常会将该项目所需的依赖包整理为一个文本文件,用户在安装部署该项目源代码之前,必须事先安装符合该文本文件中所需的全部依赖包,否则源代码安装将无法继续。而pip在安装依赖包时,默认使用的pip源由位于国外的www.pypi.org网站提供,由于国内特殊的网络环境,在批量安装依赖包时将会出现耗时较长或者安装中断等现象,因此,制作pip本地源变得尤为重要。本节将介绍几种制作pip本地源的方式,通过pip本地源,用户可以快速实现OpenStack项目依赖包的快速安装。

pippip最新安装包下载地址:http://pypi.python.org/pypi/pip#downloads。是Python中目前最为流行和强大的安装包管理工具,pip未来将会是传统setuptoolssetuptools安装包下载地址:http://pypi.python.org/pypi/setuptools。 Python软件包管理工具的替代者,虽然setuptools也提供了简单易用的包安装工具,如最为常见的easy_install命令行工具,便是由setuptools python包管理软件所提供的命令行,但是,setuptools后期将不再被维护(Python 3将不再支持setuptools),因此对于Python包管理而言,pip将是最佳选择。通常在安装pip之前,需要安装setuptools,如果是Python 3环境,则需要先安装Distribute。对于CentOS 6或RHEL 6以上的Linux操作系统,可以通过如下命令来安装适合用户当前环境的setuptools:

        wget https://bootstrap.pypa.io/ez_setup.py -O - | python

或者通过yum来安装setuptools:

        yum install setuptool

setuptools安装完成后,即可使用easy_install包安装管理工具。使用easy_install安装pip的命令如下:

        easy_install pip

除了提供Python软件包安装功能之外,pip还提供了类似yum的安装包查询、卸载和搜索等功能,默认情况下pip使用www.pypi.org提供的资源。pip的使用方法可以通过help命令来查看:

        root@mitaka ~]# pip help
        Usage:
          pip <command> [options]
        Commands:
          install                 Install packages.
          uninstall               Uninstall packages.
          freeze                  Output installed packages in requirements format.
          list                     List installed packages.
          show                     Show information about installed packages.
          search                   Search PyPI for packages.
          wheel                    Build wheels from your requirements.
          help                      Show help for commands.
        ..

如使用pip安装flask:

        [root@mitaka ~]# pip install flask

查看已经安装的包:

        [root@mitaka ~]# pip show flask
        Name: Flask
        Version: 0.11.1
        Summary: A microframework based on Werkzeug, Jinja2 and good intentions
        Home-page: http://github.com/pallets/flask/
        Author: Armin Ronacher
        Author-email: armin.ronacher@active-4.com
        License: BSD
        Location: /usr/lib/python2.7/site-packages
        Requires: click, Jinja2, Werkzeug, itsdangerous

pip在配置文件~.pip/pip.conf中通过index-pypi参数配置了默认安装源,默认安装源为http://pypi.python.org/simple,因此pip install和pip serach命令默认都会到pypi.python.org上下载或搜索pypi(python package index)软件包。相对国外pip源,国内网络环境要快很多,因此如果采用网络安装源进行pip安装,则建议采用国内的pip源,这里推荐采用豆瓣源或者阿里云源进行安装。安装源的配置只需更改pip.conf中的[global]配置段即可,具体如下:

        //豆瓣源配置
        [global]
        trusted-host = pypi.douban.com
        index-url = http://pypi.douban.com/simple
        //阿里云源配置
        [global]
        trusted-host=mirrors.aliyun.com
        index-url=http://mirrors.aliyun.com/pypi/simple/

pip在安装过程中,安装文件默认缓存在$HOME/.cache/pip目录,在该目录中会生产很多以阿拉伯数字或字母命名的子目录,这些子目录中存放着pip安装时下载的缓存文件。pip缓存目录如下:

        [root@mitaka http]# pwd
        /root/.cache/pip/http
        [root@mitaka http]# ll
        total 0
        drwx------.  9 root root 62 Jul 27 16:22 0
        drwx------.  6 root root 38 Jul 27 16:23 1
        drwx------. 13 root root 94 Jul 27 16:23 2
        drwx------. 11 root root 78 Jul 27 16:22 3
        drwx------. 13 root root 94 Jul 27 16:22 4
        drwx------. 10 root root 70 Jul 27 16:23 5
        drwx------. 12 root root 86 Jul 27 16:22 6
        drwx------. 11 root root 78 Jul 27 16:22 7
        drwx------.  9 root root 62 Jul 27 16:22 8
        drwx------. 13 root root 94 Jul 27 16:23 9
        drwx------. 12 root root 86 Jul 27 16:21 a
        drwx------. 13 root root 94 Jul 27 16:23 b
        drwx------. 11 root root 78 Jul 27 16:23 c
        drwx------. 11 root root 78 Jul 27 16:23 d
        drwx------.  9 root root 62 Jul 27 16:23 e
        drwx------. 11 root root 78 Jul 27 16:17 f

由于pip缓存了安装文件,因此用户在uninstall后,如果想要重新安装,则可以直接使用缓存中的软件包进行安装,而不必要再接入互联网重新下载安装包。使用本地缓存进行安装的命令如下:

        pip install package_nmae --src $HOME/.cache

或者如下:

        pip install -r requirements.txt --src $HOME/.cache

这里的requirements.txt文件是多个需要安装的软件包的集合,pip会根据requirements.txt文件中的软件包名称和版本号自动进行下载安装,这为pip进行批量安装提供了一种实现方式。实际上,在进行OpenStack的源代码安装时,OpenStack每个项目都会提供一个requirements.txt文件,这个文件里记录了该服务项目所需要的Python依赖包。在对OpenStack项目进行源码安装(python setup.py install)之前,必须先安装requirements.txt文件中所要求的包。如下便是OpenStack Mitaka版本Nova项目(Nova-13.1.1)提供的requirements.txt文件的内容:

        # The order of packages is significant, because pip processes them in the
        #order  of  appearance.  Changing  the  order  has  an  impact  on  the  overall
        #integration  process, which may cause wedges in the gate later.
        //下述即是Nova所需的全部依赖包,安装Nova前必须先安装下述依赖包
        pbr>=1.6 # Apache-2.0
        SQLAlchemy<1.1.0, >=1.0.10 # MIT
        boto>=2.32.1 # MIT
        decorator>=3.4.0 # BSD
        eventlet! =0.18.3, >=0.18.2 # MIT
        Jinja2>=2.8 # BSD License (3 clause)
        keystonemiddleware! =4.1.0, >=4.0.0 # Apache-2.0
        ……

直接对requirements.txt包含的依赖包进行安装的命令如下:

        pip install -r requirements.txt

如果requirements.txt文件指定的软件包已经全部下载到本地文件系统中,则可以通过离线方式进行依赖包的安装,安装方式如下:

        //指定包文件路径进行离线安装
        pip install -r requirements.txt -d /path/to/packages
        //取消索引,以本地文件为pip源进行离线安装
        pip install -r requirements.txt --no-index -f file:///path/to/packages

对于网络环境较差或者大规模部署的场景,离线部署是最佳选择,用户仅需下载一次软件包,即可进行多次快速安装部署。此外,如果将已下载的软件包通过NFS等网络共享文件系统共享到集群节点,则集群节点可以同时进行离线批量安装。在进行pip离线安装之前,通常需要准备pip本地源。pip本地源可以通过两种方式来实现,首先利用pip2pi工具下载软件依赖包,然后利用Apache配置HTTP服务以提供软件包的本地HTTP下载,或者通过配置pypiserver服务来监听pip安装请求并提供本地软件包下载服务。下面对这两种pip本地源的制作方式进行介绍。

1.pip2pi结合Apache

此方法的主要思想是利用pip2pi工具下载Python包,之后配置Apache服务器以提供本地软件包的HTTP下载。基于pip2pi和Apache的pip本地源配置步骤如下:

1)创建软件包存放目录:

        mkdir -p /root/pipy

2)安装pip2pi,下载所需软件包。pip2pi安装命令如下:

        pip install pip2pi

3)下载软件包。软件包批量下载有多种方式,可以直接使用pip工具编写shell脚本下载,也可以通过上一步安装的pip2pi直接批量下载。如果通过pip进行批量下载,则可以将集群部署所需的全部requirements.txt合并到相同文件中,具体如下:

        find / -name requirements.txt -exec cat {} \; > pip_requirements_all.txt

将全部依赖软件包整合进一个依赖文件后,利用循环语句进行批量下载,脚本语句可参考如下代码:

        #! /bin/bash
        pip_require="pip_requirements_all.txt"
        while read LINE
        do
          if [[ $LINE =~ ^[a-zA-Z] ]]
          then
            echo $LINE
            pip install $LINE -d /root/pypi  //仅下载不安装,建议使用国内源下载
          fi
        done < $ pip_require

当然,如果使用pip2pi工具下载,则无须编写脚本,仅使用命令行即可进行批量下载。使用pip2pi工具下载单个依赖包,命令如下:

        pip2tgz /root/pypi pypi_name

使用pip2pi工具批量下载软件包,命令如下:

        pip2tgz /root/pypi -r pip_requirements_all.txt

采用pip2pi工具提供的pip2tgz命令行会自动将pip_requirements_all.txt依赖文件中指定的软件包全部下载到指定的目录(/root/pypi)中。为了便于后续配置Apache服务器,软件包下载存放目录建议设置为/var/www/html/pypi,例如要下载keystone项目所需的全部依赖包,可以通过如下命令实现:

        pip2tgz /var/www/html/pypi -r /openstack/keystone/requirements.txt

由于pip2pi默认使用pypi.python.org提供的源进行下载,为了提高下载速度,建议配置前文所述的国内豆瓣源或阿里源进行下载。

4)生成软件包索引。软件包下载到本地文件系统后,需要为全部软件包生成索引(Index),这样pip在安装查询时可以快速判断指定的依赖软件包是否存在于本地pip源中。索引可以使用dir2pi命令快速生成,命令如下:

        dir2pi --normalize-package-names /var/www/html/pypi

dir2pi命令将会在/var/www/html/pypi目录生成simple子目录,simple文件中是下载到本地的全部软件包标准化后的简称。simple目录中的内容如下:

        [root@ mitaka pypi]# cd /var/www/html/pypi/simple
        [root@ mitaka simple]# ls -l
        total 8
        drwxr-xr-x. 2 root root   62 Jul 28 17:53 aioeventlet
        drwxr-xr-x. 2 root root   50 Jul 28 17:53 alembic
        drwxr-xr-x. 2 root root   57 Jul 28 17:53 amqp
        drwxr-xr-x. 2 root root   50 Jul 28 17:53 anyjson
        drwxr-xr-x. 2 root root   64 Jul 28 17:53 appdirs
        ......

每个软件包在simple目录中都会生成对应子目录,目录名称为标准化后的软件包名。simple中每个以软件包名称命名的子目录下都会生成一个index.html文件,如WebOb软件包对应在simple目录中的子目录为WebOb,而WebOb子目录中index.html文件的内容如下:

        [root@ mitaka simple]# cd  WebOb
        [root@ mitaka WebOb]# more index.html
        <a href='WebOb-1.4.1.tar.gz'>WebOb-1.4.1.tar.gz</a><br />

5)配置Apache服务器。确认已经安装httpd软件包,在/etc/httpd/conf.d目录中新创建httpd虚拟机配置文件pip-server.conf。虚拟机配置文件内容如下:

        <VirtualHost *:80>
        ServerAdmin ynwssjx@126.com
        ServerName pip.warrior.com
        DocumentRoot /var/www/html/pypi
        <Directory /var/www/html/pypi>
        Options Indexes FollowSymLinks MultiViews
        Allow Override None
        Require all granted
        </Directory>
        ErrorLog logs/mirrors-error_log
        CustomLog logs/mirrors-access_log common
        </VirtualHost>

Apache服务器配置完成后,重新启动httpd服务:

        systemctl restart httpd.service
        netstat -ntl |grep 80

6)验证软件包HTTP下载。在浏览器输入http://host_ip/pypi/simple,页面将以超链接的形式显示全部可供本地下载的软件包名称,如图11-1所示。此时,单击任意软件包名称,浏览器便会自动下载对应的软件包。

图11-1 pip本地源HTTP下载页面

7)使用本地pip源安装软件。截至步骤6, pip本地源已经配置完成,现在即可使用pip本地源进行依赖包安装。用户可以通过pip安装命令行指定本地源路径,命令如下:

        pip install --index-url http://host_ip/pypi/simple -r requirements.txt

也可以通过修改pip.conf配置文件一劳永逸地修改pip安装的默认源,使其默认使用本地pip源安装软件,修改方式如下:

        [global]
        ///////////douban mirrors///////////////////
        #trusted-host=pypi.douban.com
        #index-url = http://pypi.douban.com/simple
        ///////////pip2pi&apache local repos////////////
        trusted-host=192.168.142.10
        index-url = http://192.168.142.10/pypi/simple

这样,用户便可使用如下命令进行批量依赖包的离线安装:

        pip install -r requirements.txt

通过这种方式,用户可以在集群中的多个节点上指定同一个本地pip源,并通过HTTP协议从本地Apache服务器上下载安装软件包。比起从www.pypi.org或者其他pip源下载进行安装,pip本地源的安装方式要快得多。

2.pip2pi结合pypiserver

利用pip2pi和Apache服务器结合的方式可以很好地提供pip本地源服务,但是配置Apache服务器相对复杂且不易理解,为了简单起见,用户也可以通过pip2pip与pypiserver的组合方式来提供本地pip源服务。这种方式通常只需两个步骤即可实现pip本地源:第一步是利用pip2pi将依赖包的批量下载到特定目录;第二步是启动pypiserver服务(需要预先通过pip install pypiserver命令安装pypiserver),并在启动过程中指定服务监听端口和软件包的存放路径。现在假设软件包已经下载到本地/root/pypi目录中,则可以通过如下命令启动pypiserver服务进程:

        pypi-server -i host_ip -p port packges_dir1 packges_dir12 ... &

其中,host_ip为启动pypiserver服务的主机,port为pypiserver服务监听端口,用户可以同时指定多个本地软件包路径。pypi-server命令行工具不需要使用dir2pi生成软件包Index,只需将需要的python包下载到本地,然后启动pypiserver监听服务即可。pypi-server可以使用--fall-back参数设置在指定监听的包目录中找不到需要的软件包时,pip的候选pip源名称。如下命令将前面配置的HTTP源作为pip的候选源:

        pypi-server -i 192.168.142.10-p 8080--fallback-url \
        http://192.168.142.10/pypi/simple /root/pypi &

上述启动命令中,pip首先在/root/pypi目录进行软件包搜索,如果没有找到,则转入http://192.168.142.10/pypi/simple这个HTTP服务器中搜索。此外,pypiserver服务进程必须以后台进程形式启动,在使用pip进行本地安装之前,建议先检查pypiserver进程是否正在运行,如果没有运行则需要以后台进程形式重新启动。pypiserver进程启动完成后,可以通过配置~.pip/pip.conf使pip默认使用本地pip源进行软件包安装,配置方式如下:

        [global]
        ……
        ///////////pypiserver local repos//////////////
        trusted-host=192.168.142.10
        index-url = http://192.168.142.10:8080/simple/

配置完成后,pip默认将使用本地源进行包安装。此时,用户便可使用常规的pip安装命令进行批量包安装,具体命令如下:

        pip install -r requirements.txt

此外,如果需要屏蔽pypiserver提供的本地pip源服务,则只需停止pypiserver服务进程即可。由于pypiserver运行在后台,通常可以使用lsof命令查出pypiserver的PID,并通过kill命令将其停止即可。

11.1.2 制作OpenStack离线安装yum源

在Linux系统的软件包管理工具中,rpm和yum是两个最常见的工具。rpm是由Redhat公司开发的包管理工具,即Redhat Package Management的缩写。rpm可用于软件包的安装、卸载和查看等操作,但是rpm包并不能解决软件包依赖问题。而Linux作为一个开源系统平台,很多软件包的安装和运行需要依赖额外软件,如在使用rpm命令安装某个软件包时,可能需要先安装另一个依赖软件包,而rpm并不能自动处理这种依赖关系。相反,yum软件包管理工具却可以自动处理软件包之间的依赖关系,并能够通过网络yum源自动进行依赖查询和安装。因此,yum是Linux系统中非常重要的软件包管理工具。在OpenStack的离线部署中,用户可以事先同步网络yum源至本地,并将同步到本地的软件包制作成本地yum源,之后利用本地yum进行OpenStack集群节点的快速安装部署。

1.yum基础介绍

yum是Yellowdog Updater Modified的简称。yellowdog是一个Linux发行版。yum最初便是由yellowdog发行版的开发者Terra Soft利用Python语言开发而来的,当然,Terra Soft开发时还称之为yup(yellow dog updater)。之后杜克大学的Linux开发团队对其进行了改进,之后便将其称之为yum(Yellowdog Updater Modified)。yum的主要任务就是自动处理与软件包相关的操作,如软件升级、安装或移除rpm包、收集rpm包的相关信息以及检查软件包依赖性并自动将依赖关系告知用户。yum最重要的地方在于配置yum仓库(Repository),即yum源。Repository可以是HTTP或FTP站点,也可以是本地目录或文件夹(File)。对于任何一个yum仓库,都必须生成一张包含全部软件元数据信息的清单表(Manifest),元数据信息又称rpm软件包的header, header包括了rpm包的各种信息,如软件包的描述、功能介绍、包含的文件以及依赖的软件包列表等。yum仓库中的Manifest对全部rpm软件进行了汇总统计,当用户在使用yum命令进行指定rpm软件包的操作时,yum便会查询Manifest以获取相关的信息。Linux提供了Createrepo软件包用以创建软件仓库,在制作本地yum源时,通常利用Createrepo将包含rpm软件包的目录创建为yum仓库,然后在/etc/yum.repos.d中配置指向该仓库的yum源即可(通常命名为filename.repo形式)。

yum有两类配置文件:一个是yum.conf配置文件,这是yum服务的通用全局配置文件;另一个是yum特定仓库配置文件,仓库配置文件通常以.repo结尾。yum.conf是yum的全局性配置文件,位于/etc目录,通常情况无须更改此配置文件。yum.conf主要用于配置yum的缓存目录、运行调式级别、日志文件、插件和gpg检查是否启用等全局性默认参数。如下是Centos7系统中的yum.conf配置文件内容,不同Linux版本的yum.conf内容类似:

        [root@mitaka ~]# more /etc/yum.conf
        [main]
        cachedir=/var/cache/yum/$basearch/$releasever  //yum下载软件包的缓存目录
        keepcache=0      //是否保存缓存,1为保存
        debuglevel=2     //调式级别(0-10)
        logfile=/var/log/yum.log    //yum日志文件
        exactarch=1  //是否允许更新不同架构的rpm包,如是否在i386上更新i686的rpm包
        obsoletes=1  //是否允许update陈旧的rpm包,1为允许
        gpgcheck=1   //是否进行gpg(GNU Private Guard)检查
        plugins=1    //是否允许使用插件,1为允许,通常需要使用yum-fastestmirror插件
        installonly_limit=5 //允许保留多少kernel包
        bugt racker_url=http://bugs.centos.org/set_project.php? project_id=23&ref=http://
            bugs.centos.org/bug_report_page.php? category=yum
        distroverpkg=centos-release //告知yum系统版本
        ……
        # metadata_expire=90m      //rpm包元数据到期时间
        # PUT YOUR REPOS HERE OR IN separate files named file.repo  in
        #/etc/yum.repos.d

yum特定仓库配置文件位于/etc/yum.repos.d目录,通常特定的yum仓库对应一个独立的仓库配置文件(也可以在同一个配置文件中指定多个仓库源)。对于Centos 7系统,默认的yum仓库配置文件如下:

        [root@mitaka ~]# ls -l /etc/yum.repos.d
        total 28
        -rw-r--r--. 1 root root 1664 Dec  9  2015 CentOS-Base.repo
        -rw-r--r--. 1 root root 1309 Dec  9  2015 CentOS-CR.repo
        -rw-r--r--. 1 root root  649 Dec  9  2015 CentOS-Debuginfo.repo
        -rw-r--r--. 1 root root  290 Dec  9  2015 CentOS-fasttrack.repo
        -rw-r--r--. 1 root root  630 Dec  9  2015 CentOS-Media.repo
        -rw-r--r--. 1 root root 1331 Dec  9  2015 CentOS-Sources.repo
        -rw-r--r--. 1 root root 1952 Dec  9  2015 CentOS-Vault.repo

其中,每一个repo文件都可以包含一个或多个yum源仓库。以CentOS-Base.repo为例,该仓库配置文件中的内容如下:

        [root@mitaka bak]# more CentOS-Base.repo
        ……
        [base]
        name=CentOS-$releasever - Base
        mirrorlist=http://mirrorlist.centos.org/? release=$releasever&arch=\
        $basearch&repo=os&infra=$infra
        #baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/\
        gpgcheck=1
        gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
        ……

CentOS-Base.repo中一共配置了base、updates、extras和centosplus四个yum源,每个yum源的配置形式都是固定的,通常由name、mirrorlist(或baseur)、gpgcheck、enabled和gpgkey几个参数组成。其中,name是由用户自定义的yum源名称,可以根据yum源的功能特性进行自定义命名。mirrorlist或baseurl用于指定yum仓库源的位置,baseurl的值是一个具体的rpm软件包仓库,该仓库中通常包含一个存放rpm包元数据信息的repodata目录,而mirrorlist是一个存放rpm包仓库链接的列表网站,yum会在mirrorlist指定的列表中选择合适的rpm仓库作为软件下载或更新的yum源。enabled参数用于设置是否启用该yum源,仅有enbaled为1的情况下,yum才会搜索此yum源。gpgcheck和gpgkey主要用于设置yum仓库的gpg校验,gpgcheck参数用于设置是否需要进行gpg验证,如果值为0则不需要,此时也无须设置gpgkey参数;如果值为1则表示需要进行验证,则此时需要设置gpgkey以提供gpg验证码。

2.同步OpenStack安装包至本地

此处以制作基于Redhat发行的OpenStack版本(RDO, Redhat Distribution OpenStack)本地yum源为例,进行OpenStack离线安装yum源制作的讲解。根据不同的OpenStack版本,用户可能需要通过不同的方式启用OpenStack repository具体方式参见http://docs.openstack.org/$release/install-guide-rdo/environment-packages.html。,这里以在CentOS 7系统中部署Mitaka版本为例。为了支持RDO的OpenStack repository,通常需要启用extras repository,而Centos 7的CentOS-Base.repo中默认已经存在extras repository,因此仅需在Centos 7系统中安装OpenStack的Mitaka版本rpm包仓库即可:

        yum install centos-release-openstack-mitaka

安装完成之后,/etc/yum.repos.d中将会增加几个与OpenStack和Ceph相关的.repo配置文件,这些配置文件中已经设置了OpenStack和Ceph的yum源仓库。这几个新增的repository配置文件分别是CentOS-OpenStack-mitaka.repo、CentOS-Ceph-Hammer.repo和CentOS-QEMU-EV.repo。/etc/yum.repos.d目录中的repository配置文件如下:

        [root@mitaka yum.repos.d]# ls -l /etc/yum.repos.d
        total 40
        -rw-r--r--. 1 root root 1664 Dec  9  2015 CentOS-Base.repo
        -rw-r--r--   1 root root 1057 Feb 25   2016 CentOS-Ceph-Hammer.repo
        -rw-r--r--. 1 root root 1309 Dec  9  2015 CentOS-CR.repo
        -rw-r--r--. 1 root root  649 Dec  9  2015 CentOS-Debuginfo.repo
        -rw-r--r--. 1 root root  290 Dec  9  2015 CentOS-fasttrack.repo
        -rw-r--r--. 1 root root  630 Dec  9  2015 CentOS-Media.repo
        -rw-r--r--   1 root root 1128 Oct   6 03:30 CentOS-OpenStack-mitaka.repo
        -rw-r--r--   1 root root   578 Oct   6   2015 CentOS-QEMU-EV.repo
        -rw-r--r--. 1 root root 1331 Dec  9  2015 CentOS-Sources.repo
        -rw-r--r--. 1 root root 1952 Dec  9  2015 CentOS-Vault.repo

其中,CentOS-OpenStack-mitaka.repo中设置了Mitaka版本OpenStack的rpm安装包yum源,其内容如下:

        [root@mitaka yum.repos.d]# more CentOS-OpenStack-mitaka.repo
        ……
        [centos-openstack-mitaka]
        name=CentOS-7-OpenStack mitaka
        baseurl=http://mirror.centos.org/centos/7/cloud/$basearch/openstack-mitaka
        gpgcheck=1
        enabled=1
        gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-Cloud
        ……

在CentOS-OpenStack-mitaka.repo中,仅启用了centos-openstack-mitaka这个yum源,该yum源中指定了安装OpenStack所需rpm包的仓库路径。正常情况下,此时已经可以进行在线安装OpenStack,而如果需要进行离线安装,则还需到centos-openstack-mitaka这个yum源设置的rpm仓库中下载Redhat封装的OpenStack Mitaka版本rpm软件包到本地。下载yum仓库中的rpm包有两种方式:一种是通过rsync命令远程同步rpm包到本地;另一种是通过reposync自动以repository为单位同步rpm包到本地。rsync是一个功能相当丰富的文件同步工具,可以基于TCP/IP网络将远程文件同步到本地,并且具有丰富的参数可供选择。如果采用rsync进行OpenStack rpm安装包的同步,则可以参考如下OpenStack安装包同步脚本:

        #! /bin/bash
        #This Script used to download openstack mitaka rpm packages to local
        rsyncBin="/usr/bin/rsync" //命令路径,如果没有则需要安装rsync包
        rsyncPerm='-avrt --delete --no-iconv --bwlimit=1000' //rsync执行参数
        Local_path='/data/openstack-mitaka'  //本地存放路径
        LogFile='/data/yum_repo/rsync_yum_log'  //存放同步操作的日志路径
        Date='date +%Y-%m-%d'                        //日期设置
        #check
        function check_rsync()
        {
        if [ $? -eq 0 ]; then
            echo "Rsync is success! " >>$LogFile/$Date.log
        else
            echo "Rsync is failed! " >>$LogFile/$Date.log
        fi
        }
        if [ ! -d "$LogFile" ]; then
            mkdir -p $LogFile
        fi
        if [ ! -d "$Local_path" ]; then
            mkdir -p $Local_path
        fi
        //开始同步openstack-mitaka
        echo 'Now start to rsync openstack-mitaka! ' >>$LogFile/$Date.log
        $RsyncBin $RsyncPerm rsync://mirror.centos.org/centos/7/cloud/x86_64\
        /openstack-mitaka $Local_path >>$LogFile/$Date.log 2>&1
        //同步完成后验证同步是否成功
        check_rsync

相比之下,由yum-utils提供的reposync yum源同步工具是更为方便的选择,reposync的语法如下:

        reposync --repoid=REPOID --download_path=DESTDIR

其中,--repoid用于指定需要同步到本地的yum仓库ID; --download_path用于指定存放rpm包的本地路径。reposync可以根据用户指定的repo ID进行同步,可以通过yum提供的repolist命令查看repo ID,具体如下:

        [root@mitaka openstack-mitaka]# yum repolist
        ……
        repo id                              repo name                        status
        base/7/x86_64                        CentOS-7- Base                  9,007
        centos-ceph-hammer/7/x86_64         CentOS-7- Ceph Hammer              40
        centos-openstack-mitaka/x86_64      CentOS-7- OpenStack mitaka     1,582
        centos-qemu-ev/7/x86_64              CentOS-7- QEMU EV                  52
        extras/7/x86_64                      CentOS-7- Extras                  393
        updates/7/x86_64                     CentOS-7- Updates               2,560
        repolist: 13,634

repolist的输出中有三列,其中第一列便是与各个yum仓库对应的ID。这里,OpenStack Mitaka的yum仓库对应的ID为centos-openstack-mitaka/x86_64。因此,要同步基于Mitaka的RDO安装包到本地/data/openstack-mitaka目录,则同步命令如下:

        reposync --repoid=centos-openstack-mitaka/x86_64\
        --download_path=/data/openstack-mitaka

同步所需时间取决于仓库大小和网络速度,就OpenStack Mitaka RDO源而言,同步完成之后,RDO源(http://mirror.centos.org/centos/7/cloud/x86_64/openstack-mitaka/)中的rpm包将被全部下载到本地目录/data/openstack-mitaka中。下载后的rpm包如图11-2所示。

图11-2 OpenStack Mitaka安装包截图

3.OpenStack本地yum源制作

OpenStack安装包下载到本地目录后,需要重新生成yum仓库或者更新原有仓库。就RDO而言,由于远程RDO源本身就是yum仓库,因此同步完成后远程yum仓库中的repodata也会被同步到本地,但是仓库路径可能已经改变,因此仅需对同步到本地的yum仓库进行升级即可。创建或更新本地yum仓库的命令为createrepo,该命令由createrepo安装包提供,具体如下:

        [root@mitaka ~]# whereis createrepo
        createrepo: /usr/bin/createrepo /usr/share/createrepo
        /usr/share/man/man8/createrepo.8
        [root@mitaka ~]# rpm -qf /usr/bin/createrepo
        createrepo-0.9.9-23.el7.noarch

因此,如果不能使用createrepo命令,则应安装createrepo软件包(通常Linux发行版的ISO镜像中包含该软件包):

        yum install createrepo

如果当前存放rpm包的路径中没有repodata目录或repodata目录损坏,则可以重新创建yum仓库,在当前目录(/data/openstack-mitaka)创建yum仓库的命令如下:

        [root@mitaka ~]#createrepo --baseurl=/data/openstack-mitaka \
        /data/openstack-mitaka
        ……

创建成功之后,在/data/openstack-mitaka目录下将会看到repodata目录:

        [root@mitaka openstack-mitaka]# ls -ld repodata
        drwxr-xr-x 2 root root 4096 May 18 11:37 repodata

repodata目录中存放了与此yum仓库相关的元数据信息,yum通过这些元数据与仓库进行交互。如果当前目录中已经存在repodata目录,而仅希望更新当前yum仓库,则可以使用createrepo的--update参数,命令如下:

        [root@mitaka ~]# createrepo --baseurl=/data/openstack-mitaka --update\
        /data/openstack-mitaka

yum仓库创建完成后,需要在/etc/yum.repos.d中进行相应的配置,以便yum命令能够直接访问创建的yum仓库。本例中,在/etc/yum.repos.d中创建一个repository配置文件openstack-mitaka.repo,其内容如下:

        [root@mitaka yum.repos.d]# more openstack-mitaka.repo
        [openstack-mitaka]
        name=openstack-mitaka                             //自定义仓库名称
        baseurl=file:///data/openstack-mitaka            //仓库地址
        enbaled=1                                         //启用此仓库
        gpgcheck=0                                        //不进行GPG验证

配置完成后,通常需要清除yum中原有的cache,并重新生成cache。清除yum陈旧cache的命令如下:

        [root@mitaka yum.repos.d]# yum clean all

然后,重新生成cache,命令如下:

        [root@mitaka yum.repos.d]# yum makecache

至此,已经可以使用本地yum源进行离线OpenStack安装。下面以安装OpenStack对象存储Swift为例。这里安装与Swift相关的全部软件包,正常情况下yum应该自动解析依赖并到本地openstack-mitaka仓库中下载Swfit软件包和依赖包并进行安装,安装过程如下:

        [root@mitaka ~]# yum install openstack-swift-*
        ……
        Install  7 Packages (+3 Dependent packages)
        Total download size: 2.0 M
        Installed size: 8.4 M
        Is this ok [y/d/N]:

从上述安装过程中可以看到,yum自动解析与Swift相关的软件包,并在openstack-mitaka这个本地yum仓库中查询到了全部所需的安装包,只要用户确认安装并输入“y”,yum就会自动到/data/openstack-mitaka目录中提取RPM安装包进行安装。与在线网络安装相比,基于本地yum源的离线安装速度要快得多,并且通过NFS共享方式,可以向多个节点发送并行命令进行批量安装。尤其是在大规模集群安装部署中,制作OpenStack本地yum源并进行离线安装是非常必要的。