什么是定制rpm包?为什么要定制rpm包?
将原本使用源码安装的服务,打包成rpm包; 使用源码安装,步骤繁琐复杂浪费时间,把源码包打成rpm包安装时可以节省时间,提高工作效率。做好rpm包,可以将rpm包放入yum仓库中,方便安装。
rpm包的俩种制作方式:
1.rpmbuild制作:学会SPEC语言
2.fpm制作:fpm是封装了rpmbuild,不再要求我们学会SPEC语言
本文先讲解fpm制作rpm包:
一、系统环境:
[root@localhost ~]# cat /etc/centos-release CentOS Linux release 7.6.1810 (Core) [root@localhost ~]# uname -r 3.10.0-957.el7.x86_64 [root@localhost ~]# getenforce Disabled [root@localhost ~]# systemctl status firewalld [root@localhost ~]# systemctl stop firewalld
二.安装fpm
1.下载阿里云的base源和epel源
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
2.安装ruby环境
yum -y install ruby rubygems ruby-devel
3.查看gem默认的源
[root@localhost apprun]# gem sources
gem作用:gem和yum差不多,是包管理工具,yum来管理.rpm的包,gem来管理.gem包
4.删除gem默认官方源
gem sources --remove https://rubygems.org/ https://rubygems.org/ removed from sources
查看
[root@localhost apprun]# gem sources
5.添加阿里云的gem源
gem sources -a https://mirrors.aliyun.com/rubygems/ https://mirrors.aliyun.com/rubygems/ added to sources
查看
[root@localhost apprun]# gem sources
*** CURRENT SOURCES ***
https://mirrors.aliyun.com/rubygems/
[root@localhost apprun]#
6.安装fpm
[root@localhost apprun]# gem install fpm -v 1.3.3
....
ERROR: Error installing fpm:
childprocess requires Ruby version >= 2.4.0.
[root@localhost apprun]#
升级ruby:
升级Ruby之前,我们需要先安装Ruby Version Manager(简称RVM),它是Ruby环境的管理器,可以让我们轻松地切换不同的Ruby版本。以下是安装RVM的步骤:
7.安装Ruby Version Manager
第一步:安装gpg密钥[执行第二步会提示]
第二步:安装RVM (会提示安装密钥,网络情况可能需多次操作成功)
curl -L get.rvm.io | bash -s stable
安装完成按提示重新连接就可以使用rvm
[root@localhost ~]# rvm -v
rvm 1.29.12 (latest) by Michal Papis, Piotr Kuczynski, Wayne E. Seguin [https://rvm.io]
[root@localhost ~]#
将用户添加到rvm组:
查看组:cat /etc/group
root用户加入组: [root@localhost ~]# usermod -aG rvm root
查看root用户所属组列表:
[root@localhost ~]# groups root
root : root rvm
[root@localhost ~]#
列表显示都可以安装ruby的哪些版本
rvm list known
更新ruby至版本3.0.0
rvm install 3.0.0
安装fpm
三、定制rpm包~本文以openresty-1.17.8.1[选取版本过低,为测试后面升级]为例:
1.创建制作目录
mkdir -p /application/tools/
cd /application/tools/
官网准备源码包[上传安装包 openresty-1.17.8.1.tar.gz]
2.开启yum缓存:
sed -i 's#keelcache=0#keepcache=1#g' /etc/yum.conf
清空本机已有yum缓存:
find /var/cache/ -type f -name "*.rpm" |xargs rm -f
3.编译安装[openresty-1.17.8.1.tar.gz]:
cd /application/tools/
安装依赖:
yum install -y gcc gcc-c++ openssl-devel pcre-devel readline-devel
下面四行命令,打依赖包[有很强的版本针对性,如果做不到安装机系统版本一致性,不建议采纳]
find /var/cache/ -type f -name "*.rpm"
#另存rpm包,依据环境不同
find /var/cache/ -type f -name '*.rpm' | xargs cp -t /apprun/tmp/
cd /apprun/tmp/ && tar -zcf openresty-1.17.8.1.el7_yum.tar.gz *.rpm
sz openresty-1.17.8.1.el7_yum.tar.gz
cd /application/tools/
tar -zxf openresty-1.17.8.1.tar.gz
cd openresty-1.17.8.1/
./configure \
--user=apprun \
--group=apprun \
--prefix=/apprun/openresty \
--with-cc-opt=-O2 \
--with-http_ssl_module \
--with-http_realip_module \
--with-stream_realip_module \
--with-stream \
--with-http_stub_status_module \
--with-http_v2_module \
--with-stream \
--with-stream_ssl_module \
--with-stream_ssl_preread_module \
--with-openssl-opt=-g \
--with-stream
gmake && gmake install
此时openresty-1.17.8.1就被安装在了/apprun/openresty目录下~这样我们的基础源就有了,后面我们就可以依据这个修改定制我们自己适用rpm包了,fpm打包前我们先看下fpm常用参数
FPM常用参数:
-s 指定源类型 -t 指定目标类型,即想要制作为什么包 -n 指定包的名字 -v 指定包的版本号 -C 指定打包的相对路径 Change directory to here before searching forfiles -d 指定依赖于哪些包 -f 第二次打包时目录下如果有同名安装包存在,则覆盖它 -p 输出的安装包的目录,不想放在当前目录下就需要指定 -m 打包的作者 --post-install 软件包安装完成之后所要运行的脚本;同--after-install --pre-install 软件包安装完成之前所要运行的脚本;同--before-install --post-uninstall 软件包卸载完成之后所要运行的脚本;同--after-remove --pre-uninstall 软件包卸载完成之前所要运行的脚本;同--before-remove
编写脚本:[主要通过 上面提到的参数 软件包安装卸载过程前后的状态,执行定制操作,达到我们的目的]
mkdir -p /server/scripts/
cd /server/scripts/
说明:nginx.conf 配置文件定制,我这里是直接修改基础源中的/apprun/openresty/nginx/conf/nginx.conf文件实现的;不过我们也可以定制一个通过脚本覆盖
日志切割文件定制,我这也是直接扔到基础源中/apprun/openresty/nginx/sbin/nginx_log_split.sh
nginx服务脚本,我是扔在基础源目录中,通过下面的脚本处理[sudo cp -r /apprun/openresty/nginx/nginx.service /usr/lib/systemd/system/]
脚本中的参数说明:
%pre和%post段 【1,2】 当传递的第一个参数为1时,表示新安装一个rpm包。 当传递的第一个参数为2时,表示升级一个已经存在的包。 %preun和%postun段 【0,1】 当传递的第一个参数为0时,表示删除一个包。 当传递的第一个参数为1时,表示更新一个包。
vim openresty_pre_install.sh #软件包安装完成之前所要运行的脚本
upgrade() { : #!/bin/sh [ ! -d /apprun/backup/openresty ] && mkdir -p /apprun/backup/openresty /bin/cp /var/spool/cron/root /var/spool/cron/root.bak-`date +%F_%R` /bin/cp /var/spool/cron/root /var/spool/cron/root.bak if [ -f /apprun/openresty/nginx/sbin/nginx_log_split.sh ] then echo "检测/apprun/openresty/nginx/sbin/nginx_log_split.sh 文件存在,升级前备份该文件到/apprun/backup/openresty/" /bin/cp -af /apprun/openresty/nginx/sbin/nginx_log_split.sh /apprun/backup/openresty/ fi } _install() { : #!/bin/sh if grep 'apprun' /etc/passwd then echo "apprun exist" else useradd apprun fi } if [ "${1}" == 1 ] then # "before install" goes here _install elif [ "${1}" == 2 ] then # "before upgrade" goes here upgrade fi
vim openresty_post_install.sh #软件包安装完成之后所要运行的脚本
upgrade() { : #!/bin/sh systemctl enable nginx chown -R apprun:apprun /apprun/openresty [ ! -d /apprun/openresty/nginx/logs ] && mkdir -p /apprun/openresty/nginx/logs chmod -R 644 /apprun/openresty/nginx/logs echo -e "\033[31m cron 自动清理,cron 已备份文件至: /var/spool/cron/下,并以bak+时间后缀,请以此文件进行恢复 \033[0m" #if grep -i "nginx_log_split.sh" /var/spool/cron/root #then # echo '【温馨提示】请查看nginx_log_split.sh中日志路径是否配置正确。' #else # echo '【温馨提示】已自动创建日志分割、日志清理脚本。请查看nginx_log_split.sh中日志路径是否配置正确。' # # echo "00 * * * * /bin/sh /apprun/openresty/nginx/sbin/nginx_log_split.sh > /dev/null 2>/dev/null" >> /var/spool/cron/root # # echo "00 01 * * * /usr/bin/find /apprun/openresty/nginx/logs -mtime 10 | xargs rm -f > /dev/null 2>/dev/null" >> /var/spool/cron/root #fi if [ -f /var/spool/cron/root.bak ] then cp /var/spool/cron/root.bak /var/spool/cron/root fi if [ -f /apprun/backup/openresty/nginx_log_split.sh ] && [ ! -f /apprun/openresty/nginx/sbin/nginx_log_split.sh ] then echo "复制nginx_log_split.sh到新的目录" /bin/cp -af /apprun/backup/openresty/nginx_log_split.sh /apprun/openresty/nginx/sbin/nginx_log_split.sh fi }
_install() {
:
#!/bin/sh
[ ! -d /apprun/openresty/nginx/logs ] && mkdir -p /apprun/openresty/nginx/logs
chown -R apprun:apprun /apprun/openresty/nginx/logs /apprun/openresty
chmod -R 755 /apprun/openresty/nginx/logs
sudo cp -r /apprun/openresty/nginx/nginx.service /usr/lib/systemd/system/
sudo systemctl daemon-reload
systemctl enable nginx.service
echo "00 * * * * /bin/sh /apprun/openresty/nginx/sbin/nginx_log_split.sh >/dev/null 2>/dev/null" >> /var/spool/cron/root
echo "00 01 * * * /usr/bin/find /apprun/openresty/nginx/logs -mtime 10 | xargs rm -f >/dev/null 2>/dev/null" >> /var/spool/cron/root
#[ ! -d /var/log/nginx ] && mkdir -p /var/log/nginx
#chown -R apprun:apprun /var/log/nginx /apprun/openresty
#chmod -R 755 /var/log/nginx
#systemctl enable nginx.service
#echo "00 * * * * /bin/sh /apprun/openresty/nginx/sbin/nginx_log_split.sh > /dev/null 2>/dev/null" >> /var/spool/cron/root
#
#echo "00 01 * * * /usr/bin/find /var/log/nginx -mtime 10 | xargs rm -f > /dev/null 2>/dev/null" >> /var/spool/cron/root
}
if [ "${1}" == 1 ]
then
# "after install" goes here
_install
elif [ "${1}" == 2 ]
then
# "after upgrade" goes here
upgrade
fi
vim openresty_post_uninstall.sh #软件包卸载完成之后所要运行的脚本
if [ "${1}" == 0 ] then : #!/bin/sh rm -rf /apprun/openresty #rm -f /usr/lib/systemd/system/nginx.service sed -i '/nginx_log_split.sh/d' /var/spool/cron/root sed -i '/\/apprun\/openresty\/nginx\/logs/d' /var/spool/cron/root fi
打包:
fpm -s dir -t rpm -n openresty -v 1.17.8.1 -d 'gcc,gcc-c++,openssl-devel,pcre-devel,readline-devel' \
--pre-install /server/scripts/openresty_pre_install.sh \
--post-install /server/scripts/openresty_post_install.sh \
--post-uninstall /server/scripts/openresty_post_uninstall.sh \
-f /apprun/openresty
虚拟机安装openresty-1.17.8.1-1.x86_64.rpm测试是否符合预期:
能通外网的情况下:建议安装命令采用yum localinstall自动解决依赖问题
yum localinstall -y openresty-1.17.8.1-1.x86_64.rpm
标签:apprun,--,rpm,nginx,sh,openresty,root,定制,制作 From: https://www.cnblogs.com/NGames/p/17637734.html