fpm定制化RPM包之nginx rpm包的制作

1.安装ruby模块

# yum -y install ruby rubygems ruby-devel

2.添加阿里云的Rubygems仓库,国外资源会影响下载速度

gem sources -a http://mirrors.aliyun.com/rubygems/
http://mirrors.aliyun.com/rubygems/ added to sources

移除原生的ruby仓库

gem sources --remove http://rubygems.org/

3.安装fpm

centos6:
gem install json -v 1.8.3
gem install fpm -v 1.3.3

centos7直接使用如下命令:

[[email protected] ~]# gem install fpm

Fetching: cabin-0.9.0.gem (100%)
Successfully installed cabin-0.9.0
Fetching: backports-3.8.0.gem (100%)
Successfully installed backports-3.8.0
Fetching: arr-pm-0.0.10.gem (100%)
Successfully installed arr-pm-0.0.10
Fetching: clamp-1.0.1.gem (100%)
Successfully installed clamp-1.0.1
Fetching: ffi-1.9.18.gem (100%)
Building native extensions. This could take a while...
Successfully installed ffi-1.9.18
Fetching: childprocess-0.7.0.gem (100%)
Successfully installed childprocess-0.7.0
Fetching: archive-tar-minitar-0.5.2.gem (100%)
Successfully installed archive-tar-minitar-0.5.2
Fetching: io-like-0.3.0.gem (100%)
Successfully installed io-like-0.3.0
Fetching: ruby-xz-0.2.3.gem (100%)
Successfully installed ruby-xz-0.2.3
Fetching: stud-0.0.22.gem (100%)
Successfully installed stud-0.0.22
Fetching: mustache-0.99.8.gem (100%)
Successfully installed mustache-0.99.8
Fetching: insist-1.0.0.gem (100%)
Successfully installed insist-1.0.0
Fetching: dotenv-2.2.1.gem (100%)
Successfully installed dotenv-2.2.1
Fetching: pleaserun-0.0.29.gem (100%)
Successfully installed pleaserun-0.0.29
Fetching: fpm-1.8.1.gem (100%)
Successfully installed fpm-1.8.1
Parsing documentation for cabin-0.9.0
Installing ri documentation for cabin-0.9.0
Parsing documentation for backports-3.8.0
Installing ri documentation for backports-3.8.0
Parsing documentation for arr-pm-0.0.10
Installing ri documentation for arr-pm-0.0.10
Parsing documentation for clamp-1.0.1
Installing ri documentation for clamp-1.0.1
Parsing documentation for ffi-1.9.18
Installing ri documentation for ffi-1.9.18
Parsing documentation for childprocess-0.7.0
Installing ri documentation for childprocess-0.7.0
Parsing documentation for archive-tar-minitar-0.5.2
Installing ri documentation for archive-tar-minitar-0.5.2
Parsing documentation for io-like-0.3.0
Installing ri documentation for io-like-0.3.0
Parsing documentation for ruby-xz-0.2.3
Installing ri documentation for ruby-xz-0.2.3
Parsing documentation for stud-0.0.22
Installing ri documentation for stud-0.0.22
Parsing documentation for mustache-0.99.8
Installing ri documentation for mustache-0.99.8
Parsing documentation for insist-1.0.0
Installing ri documentation for insist-1.0.0
Parsing documentation for dotenv-2.2.1
Installing ri documentation for dotenv-2.2.1
Parsing documentation for pleaserun-0.0.29
Installing ri documentation for pleaserun-0.0.29
Parsing documentation for fpm-1.8.1
Installing ri documentation for fpm-1.8.1
15 gems installed

4.在打包机器上先安装一次nginx

yum install -y gcc gcc-c++ glibc make autoconf openssl openssl-devel pcre pcre-devel glib glib-devel
useradd nginx -M -s /sbin/nologin
tar xf nginx-1.12.0.tar.gz

cd nginx-1.12.0

./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module --with-file-aio --with-http_dav_module --with-pcre

make && make install

5.编写脚本
软件包卸载前、卸载后的脚本,可以根据情况是否编写,不编写问题也不大。但是rpm安装后的脚本是必须的。

mkdir /data/scripts/ -p
cd /data/scripts/

# 编写一个rpm安装后需要执行的脚本
vim nginx_post_install.sh

#!/bin/bash

useradd nginx -M -s /sbin/nologin
chmod +x /etc/init.d/nginx
chkconfig --add nginx
echo ‘PATH=/user/local/nginx/sbin:$PATH‘>> /etc/profile.d/nginx.sh

# 卸载nginx后需要执行的脚本

# cat after_remove.sh
#!/bin/bash
rm -rf /usr/local/nginx
rm -f /etc/rc.d/init.d/nginx

准备个启动脚本,如下:

vim /etc/init.d/nginx

#!/bin/sh
#
# nginx - this script starts and stops the nginx daemon
#
# chkconfig:   - 85 15
# description:  Nginx is an HTTP(S) server, HTTP(S) reverse #               proxy and IMAP/POP3 proxy server
# processname: nginx
# config:      /usr/local/nginx/conf/nginx.conf
# pidfile:     /usr/local/nginx/logs/nginx.pid

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0

nginx="/usr/local/nginx/sbin/nginx"
prog=$(basename $nginx)

NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"

lockfile=/var/lock/subsys/nginx

make_dirs() {
   # make required directories
   user=`$nginx -V 2>&1 | grep "configure arguments:" | sed ‘s/[^*]*--user=\([^ ]*\).*/\1/g‘ -`
   if [ -z "`grep $user /etc/passwd`" ]; then
       useradd -M -s /bin/nologin $user
   fi
   options=`$nginx -V 2>&1 | grep ‘configure arguments:‘`
   for opt in $options; do
       if [ `echo $opt | grep ‘.*-temp-path‘` ]; then
           value=`echo $opt | cut -d "=" -f 2`
           if [ ! -d "$value" ]; then
               # echo "creating" $value
               mkdir -p $value && chown -R $user $value
           fi
       fi
   done
}

start() {
    [ -x $nginx ] || exit 5
    [ -f $NGINX_CONF_FILE ] || exit 6
    make_dirs
    echo -n $"Starting $prog: "
    daemon $nginx -c $NGINX_CONF_FILE
    retval=$?
    echo
    [ $retval -eq 0 ] && touch $lockfile
    return $retval
}

stop() {
    echo -n $"Stopping $prog: "
    killproc $prog -QUIT
    retval=$?
    echo
    [ $retval -eq 0 ] && rm -f $lockfile
    return $retval
}

restart() {
    configtest || return $?
    stop
    sleep 1
    start
}

reload() {
    configtest || return $?
    echo -n $"Reloading $prog: "
    $nginx -s reload
    RETVAL=$?
    echo
}

force_reload() {
    restart
}

configtest() {
  $nginx -t -c $NGINX_CONF_FILE
}

rh_status() {
    status $prog
}

rh_status_q() {
    rh_status >/dev/null 2>&1
}

case "$1" in
    start)
        rh_status_q && exit 0
        $1
        ;;
    stop)
        rh_status_q || exit 0
        $1
        ;;
    restart|configtest)
        $1
        ;;
    reload)
        rh_status_q || exit 7
        $1
        ;;
    force-reload)
        force_reload
        ;;
    status)
        rh_status
        ;;
    condrestart|try-restart)
        rh_status_q || exit 0
            ;;
    *)
        echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
        exit 2
esac

6. 打包(打包的过程其实就是将我们编译安装好的文件、目录打包,/data/scripts/是本次的打包工作目录)
# 将nginx启动脚本和注意的配置及启动文件拷贝到打包目录

mkdir -p /data/scripts/etc/rc.d/init.d
cp /etc/init.d/nginx /data/scripts/etc/rc.d/init.d/

mkdir -p /data/scripts/usr/local/nginx/
cp -r /usr/local/nginx/ /data/scripts/usr/local/nginx/

# /data/scripts目录结构
[[email protected] scripts]# tree

.
├── after_remove.sh
├── etc
│   └── rc.d
│   └── init.d
│   └── nginx
├── nginx-1.12.0-1.el6.x86_64.rpm
├── nginx_post_install.sh
└── usr
└── local
└── nginx
├── client_body_temp
├── conf
│   ├── fastcgi.conf
│   ├── fastcgi.conf.default
│   ├── fastcgi_params
│   ├── fastcgi_params.default
│   ├── koi-utf
│   ├── koi-win
│   ├── mime.types
│   ├── mime.types.default
│   ├── nginx.conf
│   ├── nginx.conf.default
│   ├── scgi_params
│   ├── scgi_params.default
│   ├── uwsgi_params
│   ├── uwsgi_params.default
│   └── win-utf
├── etc
│   └── rc.d
│   └── init.d
│   └── nginx
├── fastcgi_temp
├── html
│   ├── 50x.html
│   └── index.html
├── logs
│   ├── access.log
│   ├── error.log
│   └── nginx.pid
├── proxy_temp
├── sbin
│   └── nginx
├── scgi_temp
└── uwsgi_temp

# 打包,即将准备好的文件打包成rpm

# fpm -f -s dir -t rpm -n nginx --epoch 0 -v 1.12.0 --iteration 1.el6 -C /data/scripts/ -d ‘pcre-devel,openssl-devel,autoconf,glib-devel‘ --post-uninstall /data/scripts/nginx_post_install.sh --post-uninstall /data/scripts/after_remove.sh --workdir /data/scripts/ etc usr

Created package {:path=>"nginx-1.12.0-1.el6.x86_64.rpm"}

报错:
Need executable ‘rpmbuild‘ to convert dir to rpm {:level=>:error}

解决:
yum install rpm-build -y

# 注意:我们可以操作前修改下主机名,这样打包出来的Build Host就会跟着改变。

7. 安装rpm包

yum命令安装rpm包

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

这个命令会自动先安装rpm包的依赖,然后再安装rpm包。

FPM常用参数:

-f :强制覆盖[覆盖同名rpm包]
-n :指定的rpm包名
-p :指定的rpm包文件放置位置
-v :指定的rpm包版本
-d :指定依赖的软件   ( [-d ‘name‘] or [-d ‘name > version‘] 例子: -d ‘libstdc++ >= 4.4.3‘)
-a :指定系统架构,如果是noarch则为‘-a all‘ 或者 ‘-a native‘ [x86_64] 当软件不区分64位或32位的时候可以 noarch
-s :指定INPUT的数据类型 (["-s dir"] 省略数据类型)
-m :指定打包人员[Packager]  ([ -m ‘user‘])
-C :指定打包的相对路径,类似于buildroot. 譬如-C /tmp/apr/ 而打包机器的数据包路径是/tmp/apr/{opt,usr,etc} 那安装这个rpm包后,在本地的数据就是/opt/,/usr/,/etc/
-t :指定需要制作成什么包,可选项有(deb,rpm,solaris,etc)
    支持的源类型::
        "dir" "rpm" "gem" "python" "empty" "tar" "deb" "cpan" "npm" "osxpkg" "pear" "pkgin" "virtualenv" "zip"
    支持的目标类型:
        "rpm" "deb" "solaris" "puppet" "dir" "osxpkg" "p5p" "puppet" "sh" "solaris" "tar" "zip"
--description         :软件包描述
--conflicts         :指定冲突软件
--url                 :指定站点[惯例都是添加软件的官网 例如: --url "http://www.cnblog.com/roach57" ]
--verbose             :安装过程详细打印
--after-install     :包安装之后执行的脚本 也可写作 --post-install FILE
--before-install     :包安装之前执行的脚本
--after-remove         :包卸载之后执行的脚本
--before-remove     :包卸载之前执行的脚本
--after-upgrade     :包更新之后执行的脚本[仅支持 deb 和 rpm 这两种包]
--before-upgrade     :包更新之前执行的脚本
--iteration         :发布序号[就是rpm包里面的release]
--epoch             :纪元  [不知道干嘛用的]
--no-rpm-sign        :不使用rpm签名   Signature
--license             :证书许可 [可选项有 ‘BSD(开源软件)‘ ‘GPLv2(自由软件)‘ ‘MIT‘ ‘Public Domain(公共域)‘ ‘Distributable(贡献)‘ ‘commercial(商业)‘ ‘Share(共享)等‘,一般的开发都写‘BSD‘或‘GPL‘]
--vendor             :供应商名称 [ --vendor ‘[email protected]‘]
--no-depends         :代表没有任何依赖包,和-d是对立的,不能共用
--config-files         :指定配置文件,可以指定目录[递归]
--directories         :指定包目录
--category             :软件所属的类别[这是个什么软件]下面有个对应的表格:
    [参考这个文件 /usr/share/doc/rpm-x.x.x/GROUPS ]
    Amusements/Games [娱乐/游戏]
    Amusements/Graphics [娱乐/图形]
    Applications/Archiving [应用/文档]
    Applications/Communications [应用/通讯]
    Applications/Databases [应用/数据库]
    Applications/Editors [应用/编辑器]
    Applications/Emulators [应用/仿真器]
    Applications/Engineering [应用/工程]
    Applications/File [应用/文件]
    Applications/Internet [应用/因特网]
    Applications/Multimedia [应用/多媒体]
    Applications/Productivity [应用/产品]
    Applications/Publishing [应用/印刷]
    Applications/System [应用/系统]
    Applications/Text [应用/文本]
    Development/Debuggers [开发/调试器]
    Development/Languages [开发/语言]
    Development/Libraries [开发/函数库]
    Development/System [开发/系统]
    Development/Tools [开发/工具]
    Documentation [文档]
    System Environment/Base [系统环境/基础]
    System Environment/Daemons [系统环境/守护]
    System Environment/Kernel [系统环境/内核]
    System Environment/Libraries [系统环境/函数库]
    System Environment/Shells [系统环境/接口]
    User Interface/Desktops [用户界面/桌面]
    User Interface/X [用户界面/X窗口]
    User Interface/X Hardware Support [用户界面/X硬件支持]

RPM包的组成格式:

roach-1.0.1-57.el6.x86_64.rpm
  |    |     |       |     |
软件名称|     |       |     |
     版本号   |       |    |
           发布号     |      |
                   硬件平台  |
                            扩展名

例子备注:
    roach  :软件名称
    1.0.1  :软件版本号
    57.el6 :发布号主要是对软件存在的bug或漏洞进行修补,在软件功能上并没有变化,el6指的是rhel6系统中发布
    x86_64 :指64位的PC架构,另外还有‘i386‘ ‘i686‘ 等32位的PC架构,noarch是指不区分硬件架构
    rpm    :扩展名
时间: 2024-10-15 23:17:23

fpm定制化RPM包之nginx rpm包的制作的相关文章

自动化部署必备技能—定制化RPM包

这里也不介绍rpmbuild这个打包工具了,想了解的朋友自行谷歌百度.但我不建议大家花太多的时间去学习这个命令,比较晦涩,而且我会在下面介绍更简单的命令. FPM打包工具 FPM的作者是jordansissel FPM的github:https://github.com/jordansissel/fpm FPM功能简单说就是将一种类型的包转换成另一种类型. 安装fpm依赖: yum install -y  openssl* yum install -y gcc* yum install -y r

yum仓库+fpm定制rpm包

试验环境: ip:yum 10.0.0.201 yum仓库 web 10.0.0.8 web(未安装nginx) yum端安装: 第一个里程碑:创建定制的rpm包 1.开启rpm包的缓存 sed -i 's#keepcache=0#keepcache=1#g' /etc/yum.conf 2.清空已有缓存 find /var/cache/ -type f -name '*rpm'|xargs rm -f 3.编译安装nginx wget -O /etc/yum.repos.d/epel.repo

FPM定制RPM包

软件安装的常见方式: 1.编译安装: 优点:可以定制化安装目录,按需开启功能等. 缺点:需要查找并实验出合适的编译参数,诸如MySQL之类的软件编译耗时过长. 2.yum安装软件 优点:全自动化安装,不需要为依赖问题发愁. 缺点:自主性太差,软件的功能.存放位置都固定好了,不易变更(定制rpm包恰好解决这一问题) FPM打包工具: 1.简介: FPM的作者是Jordansissel FPM的GITHUB:https://github.com/jordansissel/fpm 官网:http://

FPM制作nginx rpm包

fpm介绍: FPM功能简单说就是将一种类型的包转换成另一种类型. FPM的github:https://github.com/jordansissel/fpm fpm常用参数: -s          指定源类型 -t          指定目标类型,即想要制作为什么包 -n          指定包的名字 -v          指定包的版本号 -C          指定打包的相对路径  Change directory to here before searching forfiles

Fpm 之 Nginx rpm 包制作

Fpm 之 Nginx rpm 包制作 一.下载nginx编译安包机器上 wget http://nginx.org/download/nginx-1.12.2.tar.gz 二.安装nginx的编译所需的依赖包 yum -y install pure lib gcc-c++ openssl openssl-devel 三.编译安装nginx tar -zxvf nginx-1.12.2.tar.gz cd nginx-1.12.2 ./configure --prefix=/app/nginx

使用ruby的fpm模块实现对二进制MySQL的RPM包制作,实现一键安装

随着互联网的发展,一些互联网企业,甚至于传统企业的服务器也是越来越多.将面临的挑战其中之一就是自动化运维管理.假设我们需要自动化部署很多的应用,而这些应用又很复杂,过程多,需要源码安装.就算你能够用自动化来完成这些工作,但配置起来也是相当的麻烦.那么现在就有一种技术可以将源码安装的应用封装成rpm包,或者deb包等,完成一键安装,此方法运用得当可谓是如虎添翼 关于rpm包的封装制作方法有好多,我这里介绍的是一种相对简单的方法使用ruby的fpm模块来实现.学习成本低,方便,快捷 实验环境:最小化

Centos下安装nginx rpm包

1 在nginx官方网站下载一个rpm包,下载地址是:http://nginx.org/en/download.html wget http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm 2 安装这个rpm包 rpm -ivh nginx-release-centos-6-0.el6.ngx.noarch.rpm 安装过程中会出现错误提示: warning: nginx-

Linux /centos 下nginx rpm包安装及配置

Centos下安装nginx rpm包                                                                                                                            www.169it.com 1 在nginx官方网站下载一个rpm包,下载地址是:http://nginx.org/en/download.html wget http://nginx.org/packages/c

将源码编译打成rpm包----以nginx为例

打包流程准备源码软件安装rpm-build编写编译配置文件编译RPM包 具体步骤 1.装工具yum install rpm-build安装依赖包yum -y install gcc pcre-devel zlib-devel openssl-devel rpmbuild -ba nginx.spec 会报错,没有文件和目录 但是会自动在当前目录下创建一个rpmbuild目录(注意必须在用户的家目录下,本文用root用户) 在rpmbuild目录中 SOURCES 目录中存放源码包BUILDROO