OpenStack学习笔记(一):建立本地yum源

获取yum的安装包

不管是安装openstack还是相关的组件,都常用yum命令来下载,而默认的yum源经常是指向国外的网站,下载速度都不会太快,这时候有两个选择:

  • 更改repo文件,使其指向国内的yum源
  • 更改repo文件,使其指向本地的yum源

本文主要讲述的是第二种,即更改repo文件,使其指向本地的yum源。

系统环境

  • windows 10操作系统
  • python3.5.2
    (主要用到lxml,requests,os三个包,如果lxml无法安装,也可以用BeautifulSoup或者正则代替)
  • wget1.5.1
  • centos7

使用本地yum源主要分为以下几步:

  • 在windows上下载所需的RPM包
  • 将RPM包上传到centos7的虚拟机
  • 使用createrepo创建索引
  • 修改repo文件使其指向本地文件

在windows上下载所需的RPM包

在下载RPM包的时候选择的是国内的开源镜像站阿里云和网易云,下载过程中主要分为两步:
  • 生成链接文件
  • 使用wget下载文件中的链接
之所以使用wget是开始看到wget有一个参数-r可以递归下载,可是在windows系统上试验时候发现只能下载html文件,不能下载整个目录,查资料和试验后决定先写一个简单的爬虫爬取镜像站RPM包的地址,生成一个text文件,然后使用wget的-i选项来下载相应的文件,python脚本如下:
    from lxml import etree
    import requests
    import os
    
    
    class wget_list(object):
        def __init__(self,url):
            self.url_b=url
            self.response = requests.get(self.url_b)
            self.response.encoding = 'utf-8'
            self.html = etree.HTML(self.response.text)
            self.url_list=[]
            self.comd_b='wget -nc -P '
        def get_child_url(self):
            self.tmp = self.html.xpath('////@href')
            for i in self.tmp:
                self.url_list.append(self.url_b+i.text)
            return self.url_list
        def write_url_list(self,file_dict,url_w):
            f = open(file_dict, 'a')
            for i in url_w:
                f.write(i)
                f.write('\n')
            f.close()
        def wget_url(self,file_dict,file_name):
            comd=self.comd_b+file_dict+' '+file_name
            os.system(comd)
            
    url='http://mirrors.aliyun.com/epel/7/x86_64/'
    file_dict='F:\wget\epel'
    file_name='F:\wget\epel.txt'
    t=wget_list(url)
    lu=t.get_child_url()
    
    for i in lu:
        wmt=wget_list(i)
        li2=wmt.get_child_url()
        wmt.write_url_list(file_name,li2)
    
    t.wget_url(file_dict,file_name)
主要思想是先爬取网页,分析网页后拿到网页上面的全部链接,然后将链接写入txt文件,最后调用wget命令下载列表中的文件。
以epel为例,阿里云上分为了多个文件夹,每个文件夹里面又有很多的rpm文件,总共10000+个文件,如果一个一个下载几乎不可能,但是可以通过爬虫获取链接,然后批量下载。下面解释下代码部分。
    class wget_list(object):
        def __init__(self,url):
            self.url_b=url
            self.response = requests.get(self.url_b)
            self.response.encoding = 'utf-8'
            self.html = etree.HTML(self.response.text)
            self.url_list=[]
            self.comd_b='wget -nc -P '

以上部分初始化,通过传入的url链接生成etree,并初始化相关变量。

        def get_child_url(self):
            self.tmp = self.html.xpath('//a')
            for i in self.tmp:
                self.url_list.append(self.url_b+i.text)

get_child_url这个方法是获取子链接,通过之前生成的etree来通过xpath进行解析,通过分析页面发现子链接都是a标签,所以可以通过下面这xpath获取所有的子链接,再将子链接写入到url_list这个变量里。

        def write_url_list(self,file_dict,url_w):
            f = open(file_dict, 'a')
            for i in url_w:
                f.write(i)
                f.write('\n')

write_url_list这个方法是将传入的url列表追加写入到txt文件,主要用于保存构造的下载链接。

        def wget_url(self,file_dict,file_name):
            comd=self.comd_b+file_dict+' '+file_name
            os.system(comd)

wget_url这个方法则是根据传入的文件和目录,文件内的url下载到目录下。

创建repo文件

创建repo文件主要可以分为以下几步:

  • 下载安装createrepo
  • 上传RPM包
  • 执行createrepo命令

下载安装createrepo包

获取了rpm安装包之后可以在linux环境下使用createrepo命令来创建索引,之后使用yum命令就可以直接安装,而使用createrepo命令需要先下载createrepo包,这个包可以直接使用系统盘来安装,过程如下:

  • 挂载光盘到指定目录
  • 修改repo文件
  • 直接使用yum命令下载
    挂载光盘到指定目录可以直接使用以下mount命令,这样子就可以将光盘的内容挂载到指定目录了
    mount -o loop /dev/cdrom /mnt/cdrom/
    备份并新增repo文件:
    cd /etc/yum.repos.d/
    rename .repo .repo.bak *
    vi local.repo
    然后在新增的repo文件输入如下命令:
    [base]
    name=base
    baseurl=file:///mnt/cdrom
    gpgcheck=0
    enable=1
    因为yum命令会判断/etc/yum.repos.d目录下的后缀为repo的文件信息进行下载安装,所以先将原repo文件重命名备份,然后新增一个后缀为repo的文件即可。
    文件内容第一行、第二行仅仅指代库的名称,可以任意填写,但中括号内的必须唯一,第三行指yum源的repodata文件夹坐在目录,后面的两项指的是不需要验证,且该内容有效。
    最后通过以下命令来下载安装createrepo包。
    yum install createrepo

上传RPM包

以在镜像站下载的openstack-liberty为例子,在进行简单的IP配置之后,可以通过相关工具将文件上传到指定目录,比较常用的有secureCRT自带secureFX来将下载的openstack-liberty上传到centos的目录下。

createrepo命令

createrepo is a program that creates a repomd (xml-based rpm metadata) repository from a set of rpms.

根据命令介绍,craterepo是一个创建RPM包的仓库索引的程序,常用的主要有-p -o -d

-d --database
Generate sqlite databases for use with yum. This is now the default.
-p --pretty
Output xml files in pretty format.
-o --outputdir <url>
Optional output directory (useful for read only media).

-d指使用sqlite数据库使用yum,这个是默认选项;
-p指的是用漂亮的个数输出xml文件
-o指的是输出目录,选项后必须接目录
现在可以使用以下命令来创建repodata文件

    createrepo -p  -d -o /var/ftp/openstack-liberty /var/ftp/openstack-liberty

由执行命令后的截图可以看到生成了一个repodata文件夹,文件夹下面有一个repomd.xml文件和其他文件,这里就是仓库的索引文件,同理用命令对其他的RPM包也创建repo文件。


配置yum源

配置本机yum源

配置本机yum源,只需要按照之前的步骤,执行以下命令修改repo文件即可,修改后的文件如图所示:

vi /etc/yum.repos.d/local.repo 

图中显示repo文件包含了3个包,base,openstack-liberty和epel,其中base是光盘自带的基础包,openstack-liberty是从开源镜像站下载的rpm包,epel是centos的一些扩展应用包,基本能解决大部分软件的安装问题。可以通过以下命令验证是否配置成功,运行结果如图所示,可以看到存在base,epel,openstack-liberty三个包:

yum clean all
yum list

这里配置本机yum源完成。

配置FTP服务器

配置好本机yum源后,为了不必再其他机器上面也上传文件等一系列操作,可以直接建立一个ftp服务器,然后其他机器可以直接配置repo文件指向该目录,具体步骤如下:

  • 安装vsftpd
    yum install vsftpd
  • 启动ftp服务并设置为自启动
    systemctl restart vsftpd.service
    systemctl enable vsftpd.service
  • 修改配置文件指定ftp的目录,在最后一行添加一句anon_root=/var/ftp/来指定ftp目录,之后可以登录本机FTP站点验证。
    vi /etc/vsftpd/vsftpd.conf
  • 关闭防火墙
    systemctl stop firewalld.service
    systemctl disable firewalld.service
  • 清空iptables
    iptables -Z
    iptables -F
    iptables -X

修改repo文件

在另一台机上面备份repo文件,然后修改repo文件如下:

  cd /etc/yum.repos.d/       
  rename .repo .repo.bak *
  vi local.repo

在另一台机执行命令,进行测试,发现可以正常使用,至此,本地yum配置完成。

yum clean all
yum list

遇过的问题:

推荐阅读更多精彩内容