07月22, 2018

FPM制作RPM包

FPM打包工具

根据业务的需求制作统一规则的RPM包,已经成为中大型互联网企业运维自动化的必要技能。目前比较流行的打包工具主要分为了两种。其一是rpmbuild工具,该工具出现的时间较早,使用的范围也比较广,是目前主流的RPM打包工具。其次是FPM工具,由于出现时间较晚,官方文档比较少,目前使用的人群不是特别多,但是由于其简化了打包的流程,相信未来会逐渐引起运维人员的注意。

为什么选择FPM

目前,公司内部使用的是rpmbuild工具来构建的rpm包,每次做一些类似版本更新等小的改动,都必须重新编写spec这个复杂的文件,为rpm包的制作带来了很多麻烦。既然利用rpmbuild制作rpm包主要的难点是spec文件的编写,那么能不能有一种办法来跳过编写spec文件呢?于是后来就有了fpm打包工具,fpm是在rpmbuild的基础上开发出来的工具,只需一行命令即可完成rpm包的制作,而相应的spec文件的内容,都以参数的形式传给了该命令。


FPM打包工具简介

FPM是由jordansissel基于ruby语言开发的一种方便打包的工具。简单说就是将一种类型的包转换成另一种类型的包。 Github:https://github.com/jordansissel/fpm。

支持的源类型包

     类型    说明

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

支持的目标类型包

     类型    说明

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

FPM安装

   yum -y install ruby rubygems ruby-devel
   # 添加淘宝Ruby仓库
   gem sources -a http://ruby.taobao.org/
  # 移除原生的Ruby仓库
  gem sources --remove http://rubygems.org/
  # 安装fpm
  gem install fpm

FPM使用

只需要一行命令即可实现rpm包的制作(fpm打包之前,需要安装rpmbuild工具)。

   %Fpm –s <source type> -t <target type> [options]

参数说明 参数 说明

 -s    指定源类型
 -t    指定目标类型,即想要制作为什么包
 -n    指定包的名字
 -v    指定包的版本号
 --iteration    Release值,发布的序列号
 --epoch    Epoch值
 --vendor    厂商
 --maintainer    维护者
 --description    描述
 --url    软件主页
 --workdir    Fpm工作目录
 -directories    递归指定的目录标记为属于这个包
 -C    指定打包的相对路径,切换到指定的目录
 -d    指定依赖于哪些包
 -f    第二次打包时目录下如果有同名安装包存在,则覆盖它
 -p    输出的安装包的目录,不想放在当前目录下就需要指定
 --category    分组‘Development/App’
 License    BSD
 --pre-install     软件包安装完成前所要运行的脚本
 --post-install    软件包安装完成之后所要运行的脚本
 --Post-uninstall  软件包卸载完成之后所要运行的脚本
 --pre-uninstall   软件包卸载完成之前所要运行的脚本
 --after-upgrade   包升级后执行的脚本
 --before-upgrade  包升级前执行的脚本

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

1、安装nginx

yum -y install pcre-devel openssl-devel
useradd nginx -M -s /sbin/nologin
tar xf nginx-1.6.2.tar.gz
cd nginx-1.6.2
./configure --prefix=/application/nginx-1.6.2 --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module
make && make install
ln -s /application/nginx-1.6.2/ /application/nginx

2、编写脚本

[root@oldboy ~]# cd /server/scripts/
[root@oldboy 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@oldboy ~]# 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@oldboy ~]# 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、更多FPM使用案例可以参考以下链接

 https://github.com/jordansissel/fpm/wiki

总结与展望

FPM由于去除了RPMBuild工具所依赖的spec文件,使得rpm包的自动化进行变得更加容易。但同时,在进行编译RPM包时所需要的参数变得很多,这是无法避免的。未来在制作RPM包时,可以以表单的方式提供给FPM所必须的参数,由于FPM参数较多,其中某些参数一般是不需要改动的,某些参数是必填的,某些参数是可以忽略的,因此在设计表单时,可以分成具有默认值的表单、必填项表单、可忽略的表单,这样既不会造成RPM包某些项的漏写,同时加速rpm包的编译和生成。

参考文档

http://blog.oldboyedu.com/autodeploy-rpm/

http://www.zyops.com/autodeploy-rpm

本文链接:https://www.opsdev.cn/post/i-wuwei1/fpm.html

-- EOF --

Comments

评论加载中...

注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理。