一、定制rpm包制作之FPM

什么是定制rpm包?为什么要定制rpm包?

1 将原本使用源码安装的服务,打包成rpm包;
2 使用源码安装,步骤繁琐复杂浪费时间,把源码包打成rpm包安装时可以节省时间,提高工作效率。做好rpm包,可以将rpm包放入yum仓库中,方便安装。 
什么是定制rpm包?为什么要定制rpm包?

 

rpm包的俩种制作方式:

1.rpmbuild制作:学会SPEC语言

2.fpm制作:fpm是封装了rpmbuild,不再要求我们学会SPEC语言

 

本文先讲解fpm制作rpm包:

一、系统环境:

1 [root@localhost ~]# cat /etc/centos-release
2 CentOS Linux release 7.6.1810 (Core)
3 [root@localhost ~]# uname -r
4 3.10.0-957.el7.x86_64
5 [root@localhost ~]# getenforce
6 Disabled
7 [root@localhost ~]# systemctl status firewalld
8 [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]:

 1 cd /application/tools/
 2 
 3 安装依赖:
 4 yum install -y gcc gcc-c++ openssl-devel pcre-devel readline-devel
 5 
 6 下面四行命令,打依赖包[有很强的版本针对性,如果做不到安装机系统版本一致性,不建议采纳]
 7 
 8 find /var/cache/ -type f -name "*.rpm"
 9 
10 #另存rpm包,依据环境不同
11 find /var/cache/ -type f -name '*.rpm' | xargs cp -t /apprun/tmp/
12 
13 cd /apprun/tmp/ && tar -zcf openresty-1.17.8.1.el7_yum.tar.gz *.rpm
14 
15 sz openresty-1.17.8.1.el7_yum.tar.gz
16 
17  
18 
19 cd /application/tools/
20 
21 tar -zxf openresty-1.17.8.1.tar.gz
22 
23 cd openresty-1.17.8.1/
24 ./configure \
25 --user=apprun \
26 --group=apprun \
27 --prefix=/apprun/openresty \
28 --with-cc-opt=-O2 \
29 --with-http_ssl_module \
30 --with-http_realip_module \
31 --with-stream_realip_module \
32 --with-stream \
33 --with-http_stub_status_module \
34 --with-http_v2_module \
35 --with-stream \
36 --with-stream_ssl_module \
37 --with-stream_ssl_preread_module \
38 --with-openssl-opt=-g \
39 --with-stream
40 
41 gmake && gmake install
编译安装-创建基础源

 

此时openresty-1.17.8.1就被安装在了/apprun/openresty目录下~这样我们的基础源就有了,后面我们就可以依据这个修改定制我们自己适用rpm包了,fpm打包前我们先看下fpm常用参数

 

FPM常用参数:

 1 -s          指定源类型
 2 -t          指定目标类型,即想要制作为什么包
 3 -n          指定包的名字
 4 -v          指定包的版本号
 5 -C          指定打包的相对路径  Change directory to here before searching forfiles
 6 -d          指定依赖于哪些包
 7 -f          第二次打包时目录下如果有同名安装包存在,则覆盖它
 8 -p          输出的安装包的目录,不想放在当前目录下就需要指定
 9 -m          打包的作者
10 --post-install      软件包安装完成之后所要运行的脚本;同--after-install
11 --pre-install       软件包安装完成之前所要运行的脚本;同--before-install
12 --post-uninstall    软件包卸载完成之后所要运行的脚本;同--after-remove
13 --pre-uninstall     软件包卸载完成之前所要运行的脚本;同--before-remove
FPM常用参数:

 

编写脚本:[主要通过 上面提到的参数 软件包安装卸载过程前后的状态,执行定制操作,达到我们的目的]

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/]

脚本中的参数说明:

 1 %pre和%post段 【12 2 
 3 当传递的第一个参数为1时,表示新安装一个rpm包。
 4 
 5 当传递的第一个参数为2时,表示升级一个已经存在的包。
 6 
 7 %preun和%postun段 【01 8 
 9 当传递的第一个参数为0时,表示删除一个包。
10 
11 当传递的第一个参数为1时,表示更新一个包。
脚本中的参数说明:

vim openresty_pre_install.sh    #软件包安装完成之前所要运行的脚本

 1 upgrade() {
 2     :
 3 #!/bin/sh
 4 [ ! -d /apprun/backup/openresty ] && mkdir -p /apprun/backup/openresty
 5 /bin/cp /var/spool/cron/root /var/spool/cron/root.bak-`date +%F_%R`
 6 /bin/cp /var/spool/cron/root /var/spool/cron/root.bak
 7 if [ -f /apprun/openresty/nginx/sbin/nginx_log_split.sh ]
 8 then
 9         echo "检测/apprun/openresty/nginx/sbin/nginx_log_split.sh 文件存在,升级前备份该文件到/apprun/backup/openresty/"
10         /bin/cp -af /apprun/openresty/nginx/sbin/nginx_log_split.sh /apprun/backup/openresty/
11 fi
12 
13 }
14 _install() {
15     :
16 #!/bin/sh
17 if grep 'apprun' /etc/passwd
18 then
19         echo "apprun exist"
20 else
21         useradd apprun
22 fi
23 
24 }
25 if [ "${1}" == 1 ]
26 then
27         # "before install" goes here
28         _install
29 elif [ "${1}" == 2 ]
30 then
31         # "before upgrade" goes here
32         upgrade
33 fi
vim openresty_pre_install.sh

vim openresty_post_install.sh   #软件包安装完成之后所要运行的脚本

 1 upgrade() {
 2     :
 3 #!/bin/sh
 4 systemctl enable nginx
 5 chown -R apprun:apprun /apprun/openresty
 6 [ ! -d /apprun/openresty/nginx/logs ] && mkdir -p /apprun/openresty/nginx/logs
 7 chmod -R 644 /apprun/openresty/nginx/logs
 8 echo -e "\033[31m cron 自动清理,cron 已备份文件至: /var/spool/cron/下,并以bak+时间后缀,请以此文件进行恢复 \033[0m"
 9 #if grep -i "nginx_log_split.sh" /var/spool/cron/root
10 #then
11 #       echo '【温馨提示】请查看nginx_log_split.sh中日志路径是否配置正确。'
12 #else
13 #       echo '【温馨提示】已自动创建日志分割、日志清理脚本。请查看nginx_log_split.sh中日志路径是否配置正确。'
14 #
15 #       echo "00 * * * * /bin/sh /apprun/openresty/nginx/sbin/nginx_log_split.sh > /dev/null 2>/dev/null" >> /var/spool/cron/root
16 #
17 #       echo "00 01 * * * /usr/bin/find /apprun/openresty/nginx/logs -mtime 10 | xargs rm -f > /dev/null 2>/dev/null" >> /var/spool/cron/root
18 #fi
19 if [ -f /var/spool/cron/root.bak ]
20 then cp /var/spool/cron/root.bak /var/spool/cron/root
21 fi
22 
23 if [ -f /apprun/backup/openresty/nginx_log_split.sh ] && [ ! -f /apprun/openresty/nginx/sbin/nginx_log_split.sh ]
24 then
25         echo "复制nginx_log_split.sh到新的目录"
26         /bin/cp -af /apprun/backup/openresty/nginx_log_split.sh /apprun/openresty/nginx/sbin/nginx_log_split.sh
27 fi
28 
29 }
30 _install() {
31 :
32 #!/bin/sh
33 [ ! -d /apprun/openresty/nginx/logs ] && mkdir -p /apprun/openresty/nginx/logs
34 chown -R apprun:apprun /apprun/openresty/nginx/logs /apprun/openresty
35 chmod -R 755 /apprun/openresty/nginx/logs
36 sudo cp -r /apprun/openresty/nginx/nginx.service /usr/lib/systemd/system/
37 sudo systemctl daemon-reload
38 systemctl enable nginx.service
39 echo "00 * * * * /bin/sh /apprun/openresty/nginx/sbin/nginx_log_split.sh >/dev/null 2>/dev/null" >> /var/spool/cron/root
40 
41 echo "00 01 * * * /usr/bin/find /apprun/openresty/nginx/logs -mtime 10 | xargs rm -f >/dev/null 2>/dev/null" >> /var/spool/cron/root
42 #[ ! -d /var/log/nginx ] && mkdir -p /var/log/nginx
43 #chown -R apprun:apprun /var/log/nginx /apprun/openresty
44 #chmod -R 755 /var/log/nginx
45 #systemctl enable nginx.service
46 #echo "00 * * * * /bin/sh /apprun/openresty/nginx/sbin/nginx_log_split.sh > /dev/null 2>/dev/null" >> /var/spool/cron/root
47 #
48 #echo "00 01 * * * /usr/bin/find /var/log/nginx -mtime 10 | xargs rm -f > /dev/null 2>/dev/null" >> /var/spool/cron/root
49 
50 
51 }
52 if [ "${1}" == 1 ]
53 then
54 # "after install" goes here
55 _install
56 elif [ "${1}" == 2 ]
57 then
58 # "after upgrade" goes here
59 upgrade
60 fi
vim openresty_post_install.sh

vim openresty_post_uninstall.sh    #软件包卸载完成之后所要运行的脚本

 1 if [ "${1}" == 0 ]
 2 then
 3     :
 4 #!/bin/sh
 5 rm -rf /apprun/openresty
 6 #rm -f /usr/lib/systemd/system/nginx.service
 7 sed -i '/nginx_log_split.sh/d' /var/spool/cron/root
 8 sed -i '/\/apprun\/openresty\/nginx\/logs/d' /var/spool/cron/root
 9 
10 fi
vim openresty_post_uninstall.sh

 

  

打包:
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

 

posted on 2023-08-17 15:25  NG-承  阅读(75)  评论(0编辑  收藏  举报

导航