获取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
遇过的问题:
- 写python文件的时候,最开始是通过提取元素内容然后拼接得到链接地址,最后发现有的元素内容不完全,会将http://mirrors.aliyun.com/epel/7/x86_64/3/389-admin-console-doc-1.1.12-1.el7.noarch.rpm 地址生成为http://mirrors.aliyun.com/epel/7/x86_64/3/389-admin-console-doc-1.1.12-1.el.. 这种地址,会省略掉后面的一些位数,后来改为取标签内的a属性的内容即可。
- 由于centos7默认使用firewall,所以不能像centos6直接清空iptables,还需要关闭防火墙。