日志管理(0) 用fpm制作scribe的rpm包

scribe一般采用源码编译安装,但是这种做法不利于批量安装或应用的快速部署,并且编译安装过程会出现许多幺蛾子。下面就扯扯怎样用fpm将scribe制作成rpm包。
1、安装fpm FPM是Ruby模块,先装上ruby的一些环境依赖。

1
$ yum install ruby rubygems ruby-devel

添加淘宝的Ruby仓库,稳定。

1
$ gem sources -a http://ruby.taobao.org/

移除原生的Ruby仓库

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

最后安装fpm

1
$ gem install fpm

2、编译安装scribe,并制作rpm包 首先安装scribe依赖的thrift

1
2
3
4
5
6
7
$ yum install boost boost-devel autoconf libevent-devel ldconfig 
$ wget https://archive.apache.org/dist/thrift/0.9.0/thrift-0.9.0.tar.gz
$ tar -zxvf thrift-0.9.0.tar.gz
$ cd thrift-0.9.0
$ ./configure --prefix=/usr/local/thrift --with-qt4=no
$ make
$ make install

再指定安装到临时目录/tmp/scribe,安装到临时目录这是fpm制作rpm包必要的步骤。

1
$ make install DESTDIR=/tmp/scribe

再安装scribe依赖的thrift-fb303

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
$ cd /opt/src/thrift-0.9.0/contrib/fb303
$ ./bootstrap.sh --with-thriftpath=/usr/local/thrift
# 假如报错:“错误:thrift/TDispatchProcessor.h:没有那个文件或目录”
# 修改makefile.am文件
# 将该行AM_CPPFLAGS += -I$(thrift_home)/include/thrift
# 改成AM_CPPFLAGS += -I$(thrift_home)/include
$ make
$ make install
# 再指定安装到临时目录/tmp/scribe
$ make install DESTDIR=/tmp/scribe
```

编译安装scribe

``` bash
$ git clone https://github.com/facebook/scribe.git scribe
$ cd scribe
$ ./bootstrap.sh --prefix=/usr/local/scribe --with-thriftpath=/usr/local/thrift/ --with-boost-filesystem=boost_filesystem
# 如果出现错误:/usr/local/include/thrift/transport/TTransport.h:34: error: expected constructor, destructor, or type conversion before ‘readAll’...后面的省略
# 解决办法:./configure中添加参数: CPPFLAGS="-DHAVE_INTTYPES_H -DHAVE_NETINET_IN_H"
$ ./configure --prefix=/usr/local/scribe --with-thriftpath=/usr/local/thrift/ --with-boost-filesystem=boost_filesystem CPPFLAGS="-DHAVE_INTTYPES_H -DHAVE_NETINET_IN_H"
# 如果报错(错误信息 /usr/bin/ld: cannot find -lthriftnb查看是否有libthriftnb.so库,如果没有需要重装thrift)
$ make
$ make install
# 再指定安装到临时目录/tmp/scribe
$ make install DESTDIR=/tmp/scribe

安装完成后创建必要的链接(这一步可以写在rpm包安装完成后执行的脚本里)

1
2
$ ln -s /usr/local/thrift/lib/libthrift-0.9.0.so /lib64/ 
$ ln -s /usr/local/thrift/lib/libthriftnb-0.9.0.so /lib64/

到目前为止,本机的scribe已经编译安装完成了,是时候用fpm将安装在临时目录/tmp/scribe中的文件制作成rpm包了。

3、将临时安装目录/tmp/scribe打成rpm包 编写安装rpm包完成后的脚本post-scribe.sh,脚本位置/root/sh/post-scribe.sh

1
2
3
$ cat post-scribe.sh 
$ ln -s /usr/local/thrift/lib/libthrift-0.9.0.so /lib64/
$ ln -s /usr/local/thrift/lib/libthriftnb-0.9.0.so /lib64/

题外话,rpm包分别可以在安装前、安装后、卸载前、卸载后这4个阶段执行不同的脚本。
根据不同的需求编写不同的脚本,然后制作rpm包的时候将这些脚本包括进去。 将临时安装目录打包成rpm包

1
2
3
$ fpm -s dir -t rpm --epoch 0 --iteration 1.el6 -v 2.0.0 -n scribe \
-d 'boost boost-devel autoconf libevent libevent-devel ldconfig' \
--post-install /root/sh/post_scribe.sh -C /tmp/scribe usr

fpm一些常用参数如下(用fpm –help可以才看所有参数详解)

1
2
3
4
5
6
7
8
9
10
11
12
-n 生成的package名字 
-p 生成的package文件输出位置
-v 生成的package版本
-d 生成的package依赖于什么软件,通常为-d 'name' 或这 -d 'name > version'
-a 系统架构名称,如果是noarch则为'-a all' 或者 '-a native'
--description 软件包描述
--conflicts 与其他什么软件冲突
-C 打包的根路径,后面跟要打入rpm包文件的路径
--pre-install rpm包安装前执行的脚本
--post-install rpm包安装后执行的脚本
--pre-uninstall rpm包卸载前执行的脚本
--post-uninstall rpm包卸载后执行的脚本

把rpm包放到yum源中,先更新中心yum仓库的元数据,然后再更新需要安装该rpm包机器的yum元数据。

1
2
3
4
5
#提供yum源服务的机器 
$ createrepo --update /mirros/centos/6.3/x86_64/ 更新repo数据
$ createrepo /mirros/centos/6.3/x86_64/ 创建repo数据
#享受yum源服务的机器
$ yum clean all yum makecache
----------------本文结束 感谢阅读----------------