CentOS6.7上使用FPM打包製作自己的rpm包

  • 2019 年 10 月 5 日
  • 筆記

自定義rpm包,還是有逼格和實際生產環境的意義的。

(下面的文檔有的代碼由於博客排版的問題導致擠在了一起,需要自己判別)

安裝FPM

fpm是ruby寫的,因此系統環境需要ruby,且ruby版本號大於1.8.5。

# 安裝ruby模塊

yum -y install ruby rubygems ruby-devel

# 添加淘寶的Rubygems倉庫,移除原生的Ruby倉庫

gem sources –addhttps://gems.ruby-china.org/ –remove https://rubygems.org/

# 安裝fpm,gem從rubygem倉庫安裝軟件類似yum從yum倉庫安裝軟件。首先安裝低版本的json,高版本的json需要ruby2.0以上,然後安裝低版本的fpm,夠用。

gem install json -v 1.8.3

gem install fpm -v 1.3.3

# 上面的2步安裝僅適合CentOS6系統,CentOS7系統直接使用gem install fpm一步搞定。

FPM參數

常用的幾個參數如下,詳細使用見fpm –help

-s          指定源類型

-t         指定目標類型,即想要製作為什麼包

-n          指定包的名字

-v          指定包的版本號

-C         指定打包的相對路徑 Change directory to here before searching forfiles

-d          指定依賴於哪些包

-f         第二次打包時目錄下如果有同名安裝包存在,則覆蓋它

-p         輸出的安裝包的目錄,不想放在當前目錄下就需要指定

–vendor   供應商

–description  注釋信息

–post-install      軟件包安裝完成之後所要運行的腳本

–pre-install       軟件包安裝完成之前所要運行的腳本

–post-uninstall    軟件包卸載完成之後所要運行的腳本

–pre-uninstall     軟件包卸載完成之前所要運行的腳本

定製nginx的RPM包實例

1. 在打包機器上先安裝一次nginx

yum -y install pcre-developenssl-devel

useradd nginx -M -s /sbin/nologin

tar xf nginx-1.8.0.tar.gz

cd nginx-1.8.0

./configure –user=nginx –group=nginx –prefix=/application/nginx-1.8.0 –with-http_ssl_module–with-http_stub_status_module

make && make install

ln -s /application/nginx-1.8.0/application/nginx

2. 編寫腳本

mkdir /server/scripts/ -p

cd /server/scripts/

軟件包卸載前、卸載後的腳本,可以根據情況是否編寫,不編寫問題也不大。但是rpm安裝後的腳本是必須的。

vim nginx_post_install.sh   #編寫一個rpm安裝後需要執行的腳本

#!/bin/bash

useradd nginx -M -s /sbin/nologin

ln -s /application/nginx-1.8.0 /application/nginx

chmod +x /etc/init.d/nginx

chkconfig –add nginx

echo 'PATH=/application/nginx/sbin:$PATH' > /etc/profile.d/nginx.sh

準備個啟動腳本,如下:

vi /etc/init.d/nginx

#! /bin/sh

# chkconfig: 2345 55 25

# Description: Startup script fornginx webserver on Debian. Place in /etc/init.d and

PATH=/application/nginx/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

NAME=nginx

NGINX_BIN=/application/nginx/sbin/$NAME

CONFIGFILE=/application/nginx/conf/$NAME.conf

PIDFILE=/application/nginx/logs/$NAME.pid

case "$1" in

   start)

        echo -n "Starting $NAME… "

        if netstat -tnpl | grep -q nginx;then

            echo "$NAME (pid `pidof $NAME`)already running."

            exit 1

        fi

        $NGINX_BIN -c $CONFIGFILE

        if [ "$?" != 0 ] ; then

            echo " failed"

            exit 1

        else

            echo " done"

        fi

        ;;

   stop)

        echo -n "Stoping $NAME… "

        if ! netstat -tnpl | grep -q nginx;then

            echo "$NAME is notrunning."

            exit 1

        fi

        $NGINX_BIN -s stop

        if [ "$?" != 0 ] ; then

            echo " failed. Use force-quit"

            exit 1

        else

            echo " done"

        fi

        ;;

   status)

        if netstat -tnpl | grep -q nginx; then

            PID=`pidof nginx`

            echo "$NAME (pid $PID) isrunning…"

        else

            echo "$NAME is stopped"

            exit 0

        fi

        ;;

   force-quit)

        echo -n "Terminating $NAME…"

        if ! netstat -tnpl | grep -q nginx;then

            echo "$NAME is notrunning."

            exit 1

        fi

        kill `pidof $NAME`

        if [ "$?" != 0 ] ; then

            echo " failed"

            exit 1

        else

            echo " done"

        fi

        ;;

   restart)

        $0 stop

        sleep 1

        $0 start

        ;;

   reload)

        echo -n "Reload service $NAME…"

        if netstat -tnpl | grep -q nginx; then

            $NGINX_BIN -s reload

            echo " done"

        else

            echo "$NAME is not running,can't reload."

            exit 1

        fi

        ;;

   configtest)

        echo -n "Test $NAME configurefiles… "

        $NGINX_BIN -t

        ;;

   *)

        echo "Usage: $0{start|stop|force-quit|restart|reload|status|configtest}"

        exit 1

        ;;

esac

3. 打包

fpm -s dir -t rpm -n nginx -v 1.8.0 –vendor "OPS@Company" –description "Nginx for Company,Build in 2016/11/28" -d 'pcre-devel,openssl-devel' –post-install /server/scripts/nginx_post_install.sh -f /application/nginx-1.8.0 /etc/init.d/nginx

# 注意:我們可以操作前修改下主機名,這樣打包出來的Build Host就會跟着改變。

4. 安裝rpm包

rpm命令安裝會報錯,如下例:

rpm -ivh nginx-1.8.0-1.x86_64.rpm 但會在缺少pcre-devel時候報錯,需要先yum安裝依賴才能安裝rpm包。

yum命令安裝rpm包

yum -y localinstall nginx-1.8.0-1.x86_64.rpm

這個命令會自動先安裝rpm包的依賴,然後再安裝rpm包。

其他

我們可以將其他的一些常用軟件如redis、mongodb、redis等都這樣定製好安裝路徑和配置文件,這樣安裝就方便多了。