定制rpm

说明这些操作全部在管理服务内操作

定制rpm,搭建内网yum仓库通过kickstart批量系统安装,这是互联网企业运维自动化的必要技能,自动化运维的基石。

1.1 面试题

有100台服务器想安装系统。你有什么方案快速部署并优化吗?需要多少时间搞定?

1.1.1 解决方案

(1) tar打包:先编译安装、打包、批量分发、解包;

(2) saltstackpuppetansible批量部署;

(3) 定制rpm所、搭建yum仓库、yum安装;

(4) openstack虚拟机镜像和docker窗口分发。

1.2 安装软件的方式

1.2.1 编译安装

优点

 按需开启功能

 可定制(定制安装目录和软件功能)、一情况下不需要网络、可选择软件版本

缺点

 需要查找并实验出适合的编译参数

 软件版本升级时,要注意某些参数已经取消掉了

 MySQLPHP等软件编译耗时过长

 慢、复杂、需要查找编译参数、找依赖麻烦、纯编译依赖比较复杂

1.2.2 yum安装

优点

 全自动化安装

 简单、便捷

 不需要为依赖问题发愁了

缺点

 自主性太差

 需要网络、网络不好时下载速度慢

 没有办法定制、软件的功能、存放位置都已经固定好了,不易变更

1.2.3 二进制安装

优点:简单、快

缺点:不能定制、包容量大

1.2.4 定制rpm包

流程根据需求编译软件==>制件rpm==>搭建内网yum仓库==>yum安装

优点:结合编译安装与yum安装两者的优点

缺点 rpm包的通用性差,只能适用于公司的环境,第一步编译安装复杂、打包后不能再次更改、一般人不会定制rpm

1.3 RPM简介

英文全称是Red Hat Package ManagerRed Hat包管理器。

几乎所有的Linux发行版本都使用这种形式的软件包管理安装、更新和卸载软件。

rpm命令有五种基本功能(但不包括创建软件包):安装、卸载、升级、查询、验证。

1.4 FPM打包工具

FPM的作者是jordansissel

FPMGitHubhttps://github.com/jordansissel/fpm 

FPM功能简单理解:就是将一种类型的包转换成另一种类型。

1.4.1 支持的源类型包

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

1.4.2 支持的目标类型包

rpm       #<==转换为rpm包
deb       #<==转换为deb包
solaris   #<==转换为solaris包
puppet    #<==转换为puppet模块

1.4.3 FPM安装

fpmruby写的,因此系统环境需要ruby,且ruby版本号大于1.8.5

#<==安装ruby模块
yum -y install ruby rubygems ruby-devel
#<==添加阿里云的Rubygems仓库
gem source -a http://mirrors.aliyun.com/rubygems/
#<==移除原生的Ruby仓库
gem source -r https://rubygems.org/
#<==安装fpm
gem install json -v 1.7.7
gem install cabin -v 0.6
gem install backports -v 2.6.2
gem install arr-pm -v 0.0.9
gem install clamp -v 0.6
#gem install childprocess -v 0.5.9
gem install fpm -v 1.3.3
#<==指定安装fpm 1.3.3版本的软件

1.4.4 FPM参数

详细使用见fpm --help

常用参数如下

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

1.5 实战定制nginx的RPM包

1.5.1 系统环境

[root@m01 ~]# cat /etc/redhat-release     #<==系统版本
CentOS release 6.7 (Final)
[root@m01 ~]# uname -r                    #<==64位系统,及内核版本
2.6.32-573.el6.x86_64
[root@m01 ~]# getenforce                  #<==关selinux
Disabled
[root@m01 ~]# /etc/init.d/iptables status #<==关防火墙
iptables:未运行防火墙。

1.5.2 准备操作

[root@m01 ~]# mkdir /application/tools/ -p #<==统一软件包存放目录
[root@m01 ~]# sed -i 's#keepcache=0#keepcache=1#g' /etc/yum.conf#<==开启yum缓存
[root@m01 ~]# find /var/cache/ -type f -name '*rpm'|xargs rm -f
#<==清空本机已有yum缓存
[root@m01 ~]# cd /application/tools/
[root@m01 tools]# wget -q http://nginx.org/download/nginx-1.6.3.tar.gz
#<==下载nginx-1.6.3

1.5.3 编译安装nginx

yum install pcre pcre-devel openssl openssl-devel -y
rpm -qa openssl openssl-devel pcre pcre-devel
find /var/cache/ -type f -name '*rpm'|xargs cp -t /tmp/
cd /tmp/ && tar zcf nginx_yum.tar.gz *.rpm
sz nginx_yum.tar.gz
--------------------------------------------------------------------------------
cd /application/tools/
useradd nginx -M -s /sbin/nologin 
tar xf nginx-1.6.3.tar.gz 
cd nginx-1.6.3
./configure --prefix=/application/nginx-1.6.3 --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module
echo $?
make && make install
echo $?
ln -s /application/nginx-1.6.3/ /application/nginx
ll -d /application/nginx-1.6.3/ /application/nginx

过程

[root@m01 tmp]# yum install pcre pcre-devel openssl openssl-devel -y
#<==安装pcre库,openssl软件,因为等下编译安装时,需要安装ssl模块
[root@m01 tmp]# rpm -qa openssl openssl-devel pcre pcre-devel#<==检查
openssl-devel-1.0.1e-48.el6_8.1.x86_64
pcre-7.8-7.el6.x86_64
openssl-1.0.1e-48.el6_8.1.x86_64
pcre-devel-7.8-7.el6.x86_64
[root@m01 tools]# find /var/cache/ -type f -name '*rpm'|xargs cp -t /tmp/
#<==另存rpm包,因为很多人的系统环境可能不一致,需要的rpm包可能不同。
[root@m01 tools]# cd /tmp/ && tar zcf nginx_yum.tar.gz *.rpm#<==打包
 
[root@m01 tmp]# cd /application/tools/#<==切换到软件包存放目录
[root@m01 tools]# useradd nginx -M -s /sbin/nologin #<==添加nginx用户
[root@m01 tools]# tar xf nginx-1.6.3.tar.gz #<==解包
[root@m01 tools]# cd nginx-1.6.3#<==切换到nginx1.6.3目录下
[root@m01 nginx-1.6.3]# ./configure --prefix=/application/nginx-1.6.3 --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module#<==配置过程
内容省略,自行脑补……
[root@m01 nginx-1.6.3]# echo $?#<==检查配置过程是否出错
0
[root@m01 nginx-1.6.3]# make && make install#<==编译&&配置过程
内容省略,自行脑补……
[root@m01 nginx-1.6.3]# echo $?#<==检查编译与配置过程是否出错
0
[root@m01 nginx-1.6.3]# ln -s /application/nginx-1.6.3/ /application/nginx
#<==做软链接
[root@m01 nginx-1.6.3]# ll -d /application/nginx-1.6.3/ /application/nginx
#<==检查
lrwxrwxrwx 1 root root   25 2016-07-29 17:37 /application/nginx -> /application/nginx-1.6.3/
drwxr-xr-x 6 root root 4096 2016-07-29 17:37 /application/nginx-1.6.3/

1.5.4 编写脚本

mkdir /server/scripts -p
cd /server/scripts/
cat >>nginx_rpm.sh< 
  

过程

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

1.5.5 打包

fpm -s dir -t rpm -n nginx -v 1.6.3 -d 'pcre,pcre-devel,openssl,openssl-devel' --post-install /server/scripts/nginx_rpm.sh -f /application/nginx-1.6.3/
ll -h
sz nginx_rpm.sh
sz nginx-1.6.3-1.x86_64.rpm

过程

[root@m01 scripts]# fpm -s dir -t rpm -n nginx -v 1.6.3 -d 'pcre,pcre-devel,openssl,openssl-devel' --post-install /server/scripts/nginx_rpm.sh -f /application/nginx-1.6.3/
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.3-1.x86_64.rpm"}
fpm命令参数详解:
-s                #<==source,指定源类型
-t                #<==target,指定目标类型,即想要制作为什么包
-n                #<==name,指定包的名字
-v                #<==version,指定包的版本号
-d                #<==depend,指定依赖于哪些包,包有多个,用逗号隔开
-f                #<==force,第二次打包时目录下如果有同名安装包存在,则覆盖它
--post-install    #<==软件包安装完成之后所要运行的脚本;同--after-install
--pre-install     #<==软件包安装完成之前所要运行的脚本;同--before-instal

1.6 rpm常用命令组合

查看

rpm -qpi包名            #<==查看rpm包详细信息
rpm -qpl包名            #<==查看rpm包里面的内容
rpm -qpR包名            #<==查看rpm包的依赖
rpm -qp --scripts 包名  #<==查看rpm包带的执行脚本,执行脚本不是以文件形式存在
rpm -qa                 #<==查看系统内所有已安装的rpm包

安装

rpm -ivh包名            #<==安装rpm包
rpm -ivh --aid 包名     #<==解决rpm包循环依赖的问题

1.6.1 rpm命令的参数

查看

-a        #<==all,所有
-q        #<==query,查询
-p        #<==package,包
-i        #<==info,信息
-l        #<==list,列表
-R        #<==requires,依赖
--scripts #<==显示脚本

安装

-i        #<==install,安装
-v        #<==显示详细信息(Print verbose information)
-h        #<==hash,显示哈希值
--aid  Add suggested packages to the transaction set(事务集)when needed.

1.7 注意事项

1.7.1 相对路径问题

fpm打包时,一定要用绝对路径

fpm -s dir -t rpm -n nginx -v 1.6.3 .#<==当路径

fpm -s dir -t rpm -n nginx -v 1.6.3 /application/nginx-1.6.3/#<==绝对路径

使用rpm -qpl查看rpm的内容fpm类似tar打包一样,只是fpm打的包能够被yum命令识别而已

过程

[root@m01 scripts]# cd /application/nginx-1.6.3/#<==切换到目录下,再打包
[root@m01 nginx-1.6.3]# fpm -s dir -t rpm -n nginx -v 1.6.3 .#<==点来代表当前目录
[root@m01 nginx-1.6.3]# rpm -qpl nginx-1.6.3-1.x86_64.rpm
#<==所有的目录,都从系统根目录开始了,所以,一定要用绝对路径打包
/conf/fastcgi.conf
/conf/fastcgi.conf.default
/conf/fastcgi_params
省略……

1.7.2 链接问题

fpm打包时,直接打包原目录(后面加不加/都没有问题),不要打包软链接目录

  • fpm -s dir -t rpm -n nginx -v 1.6.3 /application/nginx(不加/,这个软链接代表个文件)

  • 打包看似成功,但查看包的内容,是一个软链接文件

  • 原因,目录结尾的/问题,这有点类似rm删除链接目录

  • fpm -s dir -t rpm -n nginx -v 1.6.3 /application/nginx/加/,这个软链接代表目录

1.8 安装rpm包

利用backup服务测试

安装rpm包的三种方法:

1.8.0.1 rpm命令安装

[root@backup tools]# rpm -ivh nginx-1.6.3-1.x86_64.rpm 
error: Failed dependencies:
        pcre-devel is needed by nginx-1.6.3-1.x86_64
        openssl-devel is needed by nginx-1.6.3-1.x86_64
#<==但会报如上依赖错误,需要先yum安装依赖才能安装rpm包。
~ 解决方法
#<==先利用yum安装上面的两个依赖包,再执行rpm。
yum -y pcre-devel openssl-devel

1.8.0.2 yum命令安装rpm

[root@backup tools]# yum localinstall nginx-1.6.3-1.x86_64.rpm -y
#<==这个命令会自动先安装rpm包的依赖,然后再安装rpm包。

1.8.0.3 搭建内网yum仓库※※※

yum仓库搭建(且下下文分解!)