一篇文章帮你解决离线服务器的运维效率问题
在企业中,一般的服务器都是linux的,并且是不会让你联网的。这个时候我们要安装部署我们的项目,就少不了在离线服务器上安装很多的服务。有tar包的,rpm的,还有python的。如果服务器可以联网,真的会方便很多。往往就是一个命令的问题,但是对于离线服务器就变得困难重重。笔者因为最近的工作需要,从一个运维小白,一步步的变成了公司的运维大佬,虽然我是搞开发的!一个不会linux的开发,是一个不合格的开发。废话不多说,我们开始介绍离线服务器安装软件的方法吧。
tar包的安装
Tar包的安装,一般只需要我们解压之后,进行相应的配置即可。一般来说没有太大的难度。tar包的下载就需要小伙伴自己找国内的镜像下载了。如果没有国内镜像,建议使用IDM,NDM等多线程下载工具进行下载。
当然,如果是redis这种的tar包,还是需要我们使用gcc进行编译的。这个时候就要看我们的下一节了。
rpm的安装
首先,我先把rpm的安装命令给出来,让只需要安装几个包的小伙伴快速安装。
rpm -ivh xxx.rpm # 安装rpm的包,当然这需要我们使用root用户
sudo rpm -ivh xxx.rpm # 普通用户使用sudo命令来安装
# rpm卸载
rpm -e xxx
# rpm升级
rpm -Uvh xxx
# rpm 忽略依赖安装
rpm -ivh --nodeps xxx
如果你已经知道你需要安装的rpm包已经所有依赖,并且安装的数量并不多,可以使用该方法。
可能有的小伙伴会不知道如何去下载自己需要的rpm包,这里提供两个网站。一个阿里云的镜像站:阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区一个是国外的rpm搜索站:RPM Search
如果我们需要安装多台服务器,并且有台机器超过了一个rpm的包。请看下一节:构建局域网的离线yum源进行安装
构建局域网的离线yum源进行安装
重复的工作是没有效率的,一定找到更好的方法。rpm的安装是费劲的。一个包可能依赖多个包,依赖的包可能存在版本问题。那么久会很费劲。这个时候你一定想到了yum安装。自动解决依赖的问题,但是没有网络,如何使用呢?
首先,你需要在自己的电脑上安装docker环境,然后拉取一个和自己服务器版本一致的基础镜像过来。docker的安装就不说了。小伙伴自己去网上查吧,很多文章的。
整理的思路就是利用docker构建一个和服务一样的linux环境,这个环境比服务器还要精简,所以下载rpm包时,基本可以下载完所有的依赖包。然后使用createrepo命令生成我们下载包的索引文件。将索引文件和所有的rpm包复制到离线服务器上,或者直接在该容器上启动一个httpd服务器,作为我们离线服务器的yum源。
# 首先启动我们的基础容器,这个以centos为例
docker run -it -v /root/RPMS:/root/RPMS centos:centos7.5.1804 bash
# 备份原来的镜像配置文件
mkdir /etc/yum.repos.d/bak
mv /etc/yum.repos.d/*.rpm /etc/yum.repos.d/bak/
# 配置阿里云的yum源配置文件
http://mirrors.aliyun.com/repo/Centos-7.repo
# 将阿里云的镜像文件下载到容器中,因为没有wget命令,所以要靠外部命令了
# 清空并重建缓存
yum clean all
yum makecache
# 首先下载我们的createrepo的rpm包
yum install -y createrepo yum-utils
# 其次下载httpd的包
yumdownloader --resolve --destdir=/root/RPMS httpd
# 最后下载我们需要安装的包
yumdownloader --resolve --destdir=/root/RPMS xxx
# 创建我们所下载包的索引文件
createrepo /root/RPMS
# 打包我们的所有rpm包
tar -zcvf RPMS.tar.gz /root/RPMS
# scp传输到我们的离线服务器上
scp RPMS.tar.gz user@ip:/home/xxx/
# 离线服务器上的yum源配置清理,注意这一步开始都是在离线服务器上进行,不是docker容器
mkdir /etc/yum.repos.d/bak
mv /etc/yum.repos.d/*.rpm /etc/yum.repos.d/bak/
# 在离线服务器上配置我们的局域网精简的yum源
vim /etc/yum.repos.dhttpd.repo
[my_yum_repo]
name=my_yum_repo
baseurl=file:///opt/RPMS
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
# 如果局域网使用,请先创建软连接之后,把baseurl改成http://host_ip/RPMS
ln -s /root/RPMS /var/www/html/
# 将yum源的配置文件同步到其他离线服务器
scp /etc/yum.repos.d/httpd.repo root@host_id:/etc/yum.repos.d
# 使用yum命令安装我们的rpm包,自动解决依赖问题
yum install -y xxx
# 如果没有更新yum源的配置文件,但是增加了yum仓库中的rpm包,需要我们彻底清空yum的缓存,否则可能不能install,只能list
yum clean all
rm -rf /var/cache/yum/*
yum makecache
python安装包的离线安装
Python开发中,如果需要安装第三方模块,可以使用一下命令安装
# pip直接安装
pip install xxx.whl
# pip同样可以直接安装tar包的python模块
pip install xxx.tar.gz
当然了,如果需要下载,我们也可以自己从网页下载,或者使用pip的命令。
可以从阿里云直接下载自己需要的模块包:http://mirrors.aliyun.com/pypi/simple/
使用pip下载命令
# pip下载命令
pip download airflow
# pip指定系统版本下载
pip download --platform linux_x86_64 --only-binary=:all: airflow
这里如果是跨平台下载进行安装的话,会有一个比较难受的问题。因为pip的下载命令,如果指定了平台,那么它就只能下载同一种类型的包。当时我们的依赖包可能只提供了一种,这个时候就会下载失败。因为pip仓库并没有强制包必须是什么格式的。所以这个问题就会造成我们大量的重复工作。因此更高效的方法在最后一节
创建纯净的虚拟环境进行离线下载和安装
对没错,依然使用docker启动一个和我们服务器一样版本的基础环境,然后安装anaconda。
其实这个方法的思路就是利用docker的容器来模拟和提供给pip的默认平台,以此来解决不能下载所有依赖的问题。
# 创建一个和离线服务器一样的python版本的虚拟环境
conda create -n airflow python=3.7.6
# 激活环境
source activate airflow
# 使用pip下载命令,下载我们需要的安装包
pip download airflow # 这个时候下载的包就都是可以在服务器上进行安装的包了
# 如果下载某些依赖报错了,则证明我们的容器环境缺少该python模块运行的必要环境,需要我们下载额外的rpm包进行解决
# 使用pip命令安装,并且指定依赖包的目录
pip install --no-index --find-links=./ airflow