千家信息网

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

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,回顾下安装软件的三种方式:1、编译安装软件,优点是可以定制化安装目录、按需开启功能等,缺点是需要查找并实验出适合的编译参数,诸如MySQL之类的软件编译耗时过长。2、yum安装软件,优点是全自动化安装
千家信息网最后更新 2026年11月01日自动化部署必备技能——定制RPM包

回顾下安装软件的三种方式:

1、编译安装软件,优点是可以定制化安装目录、按需开启功能等,缺点是需要查找并实验出适合的编译参数,诸如MySQL之类的软件编译耗时过长。
2、yum安装软件,优点是全自动化安装,不需要为依赖问题发愁了,缺点是自主性太差,软件的功能、存放位置都已经固定好了,不易变更。
===>如果你现在还为是使用编译安装软件还是使用yum安装软件发愁,那你就out了。 3、编译源码,根据自己的需求做成定制RPM包->搭建内网yum仓库-yum安装。结合前两者的优点,暂未发现什么缺点。可能的缺点就是RPM包的通用性差,只能适用于本公司的环境。另外一般人不会定制RPM包。这是中大型互联网企业运维自动化的必要技能。

这里也不介绍rpm的概念,想了解的朋友可以查看http://www.ibm.com/developerworks/cn/linux/l-rpm/。

这里也不介绍rpmbuild这个打包工具了,想了解的朋友自行谷歌百度。但我不建议大家花太多的时间去学习这个命令,比较晦涩,而且我会在下面介绍更简单的命令。

FPM打包工具

FPM的作者是jordansissel
FPM的github:https://github.com/jordansissel/fpm
FPM功能简单说就是将一种类型的包转换成另一种类型。

1. 支持的源类型包

dir         将目录打包成所需要的类型,可以用于源码编译安装的软件包rpm         对rpm进行转换gem         对rubygem包进行转换python       将python模块打包成相应的类型

2. 支持的目标类型包

rpm         转换为rpm包deb         转换为deb包solaris       转换为solaris包puppet       转换为puppet模块

3. FPM安装

fpm是ruby写的,因此系统环境需要ruby,且ruby版本号大于1.8.5。# 安装ruby模块 yum -y install ruby rubygems ruby-devel rpm-build# 查看当前使用的rubygems仓库 gem sources list# 添加淘宝的Rubygems仓库,外国的源慢,移除原生的Ruby仓库gem sources --add https://ruby.taobao.org/ --remove http://rubygems.org/# 安装fpm,gem从rubygem仓库安装软件类似yum从yum仓库安装软件。首先安装低版本的json,高版本的json需要ruby2.0以上,然后安装低版本的fpm,够用。gem install json -v 1.8.3gem install fpm -v 1.3.3# 上面的2步安装仅适合CentOS6系统,CentOS7系统一步搞定,即gem install fpm

4. FPM参数

详细使用见fpm -help

常用参数

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

使用实例-实战定制nginx的RPM包

1. 安装nginx

yum -y install pcre-devel openssl-develuseradd nginx -M -s /sbin/nologintar xf nginx-1.6.2.tar.gzcd nginx-1.6.2./configure --prefix=/application/nginx-1.6.2 --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_modulemake && make installln -s /application/nginx-1.6.2/ /application/nginx

2. 编写脚本

[root@web ~]# cd /server/scripts/[root@web scripts]# vim nginx_rpm.sh  # 这是安装完rpm包要执行的脚本 #!/bin/bash useradd nginx -M -s /sbin/nologin ln -s /application/nginx-1.6.2/ /application/nginx

3. 打包

[root@web ~]# fpm -s dir -t rpm -n nginx -v 1.6.2 -d 'pcre-devel,openssl-devel' --post-install /server/scripts/nginx_rpm.sh -f /application/nginx-1.6.2/ no value for epoch is set, defaulting to nil {:level=>:warn} no value for epoch is set, defaulting to nil {:level=>:warn} Created package {:path=>"nginx-1.6.2-1.x86_64.rpm"} [root@web ~]# ll -h nginx-1.6.2-1.x86_64.rpm  -rw-r--r-- 1 root root 6.7M Nov  1 10:02 nginx-1.6.2-1.x86_64.rpm

4. 安装rpm包

安装rpm包的三种方法:

  • rpm命令安装

[root@LB-nginx-01 ~]# rpm -ivh nginx-1.6.2-1.x86_64.rpm error: Failed dependencies:        pcre-devel is needed by nginx-1.6.2-1.x86_64       openssl-devel is needed by nginx-1.6.2-1.x86_64 但会报如上依赖错误,需要先yum安装依赖才能安装rpm包。
  • yum命令安装rpm包

yum -y localinstall nginx-1.6.2-1.x86_64.rpm这个命令会自动先安装rpm包的依赖,然后再安装rpm包。


注意事项

1. 相对路径问题

# 相对路径[root@web nginx]# fpm -s dir -t rpm -n nginx -v 1.6.2 .no value for epoch is set, defaulting to nil {:level=>:warn}no value for epoch is set, defaulting to nil {:level=>:warn}Created package {:path=>"nginx-1.6.2-1.x86_64.rpm"}[root@web nginx]# rpm -qpl nginx-1.6.2-1.x86_64.rpm    /client_body_temp/conf/extra/dynamic_pools/conf/extra/static_pools  …………# 绝对路径[root@web ~]# fpm -s dir -t rpm -n nginx -v 1.6.2 /application/nginx-1.6.2/no value for epoch is set, defaulting to nil {:level=>:warn}no value for epoch is set, defaulting to nil {:level=>:warn}Created package {:path=>"nginx-1.6.2-1.x86_64.rpm"}[root@web ~]# rpm -qpl nginx-1.6.2-1.x86_64.rpm /application/nginx-1.6.2/client_web_temp/application/nginx-1.6.2/conf/extra/dynamic_pools/application/nginx-1.6.2/conf/extra/static_pools/application/nginx-1.6.2/conf/fastcgi.conf/application/nginx-1.6.2/conf/fastcgi.conf.default…………使用rpm -qpl 命令可以查看rpm包的内容。注:fpm类似tar打包一样,只是fpm打的包能够被yum命令识别而已。

2. 软链接问题

[root@web ~]# fpm -s dir -t rpm -n nginx -v 1.6.2 /application/nginxno value for epoch is set, defaulting to nil {:level=>:warn}File already exists, refusing to continue: nginx-1.6.2-1.x86_64.rpm {:level=>:fatal}# 报错是因为当前目录存在同名的rpm包,可以使用-f参数强制覆盖。[root@web ~]# fpm -s dir -t rpm -n nginx -v 1.6.2 -f /application/nginxno value for epoch is set, defaulting to nil {:level=>:warn}Force flag given. Overwriting package at nginx-1.6.2-1.x86_64.rpm {:level=>:warn}no value for epoch is set, defaulting to nil {:level=>:warn}Created package {:path=>"nginx-1.6.2-1.x86_64.rpm"}打包看似成功,但查看包的内容,只是这一个软链接文件。[root@web ~]# rpm -qpl nginx-1.6.2-1.x86_64.rpm /application/nginx原因:目录结尾的/问题,类似rm删除软链接目录

定制LNMP的RPM包思路

编译安装好nginx,mysql,php,此处有个问题,就是php的大部分依赖环境是通过yum安装的,但有一个libiconv-1.14.tar.gz包需要编译安装,安装时已经指定了安装目录,只需一同打包即可。

还有一个问题,就是mysql这个目录比较大,用fpm打包耗时长。平时我们有可能需要对nginx或php做优化,这样又得重新打包。因此我们可以将mysql分离出来,分别打包。只需在制作nginx+php的rpm包时添加mysql的依赖即可。

# 参考命令 [root@web2 ~]# fpm -s dir -t rpm -n web2 -v 1.1 \--description 'lnmp.cms,bbs.blog' \-d 'libxslt-devel,nfs-utils,rpcbind,mysql,libmcrypt-devel,mhash,mhash-devel,mcrypt' \--post-install /server/scripts/lnmp-init.sh  \/application /usr/local/libiconv/ /app/logs/ /data0/  /server/


软件 目录 命令 类型 编译 仓库 脚本 问题 版本 软件包 参数 就是 缺点 路径 运行 优点 功能 模块 环境 系统 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 河南云网互联网络科技有限公司 厦门中拓互联网络科技有限公司 美国互联网科技 互联网 科技创业 广西互联网科技公司 科技赋能互联网健康 互联网实体化科技化 成都玖崟互联网科技有限公司乐商圈怎么样 互联网科技公司需要的职位 互联网科技中介 互联网系的金融科技公司 中国航天科技大学国际工业互联网 国大互联网教育科技有限公司工作 华夏恒生科技与互联网科技 上海科技产业互联网平台 富国互联网金融科技混合基金 山东大美朱楼互联网科技有限公司 易租星互联网科技有限公司 科技互联网经济论坛 互联网 科技节活动 微视频大赛 互联网金融与金融科技 互联网金融 金融科技 中国 科技 互联网 深圳卡尔迅互联网科技有限公司怎么样 海南科技产业互联网平台 上海宁丞科技互联网 湖北码尼互联网科技有限公司电话 花神(南京)互联网科技有限公司 21世纪互联网科技成就 昆明中奇联合互联网科技
0