定制rpm包
说明:这些操作全部在管理服务器内操作。
定制rpm包,搭建内网yum仓库,通过kickstart批量系统安装,这是互联网企业运维自动化的必要技能,自动化运维的基石。
1.1 面试题
有100台服务器想安装系统。你有什么方案快速部署并优化吗?需要多少时间搞定?
1.1.1 解决方案
(1) tar打包:先编译安装、打包、批量分发、解包;
(2) saltstack、puppet、ansible批量部署;
(3) 定制rpm所、搭建yum仓库、yum安装;
(4) openstack虚拟机镜像和docker窗口分发。
1.2 安装软件的方式
1.2.1 编译安装
r 优点
按需开启功能
可定制(定制安装目录和软件功能)、一情况下不需要网络、可选择软件版本
r 缺点
需要查找并实验出适合的编译参数
软件版本升级时,要注意某些参数已经取消掉了
MySQL、PHP等软件编译耗时过长
慢、复杂、需要查找编译参数、找依赖麻烦、纯编译依赖比较复杂
1.2.2 yum安装
r 优点
全自动化安装
简单、便捷
不需要为依赖问题发愁了
r 缺点
自主性太差
需要网络、网络不好时,下载速度慢
没有办法定制、软件的功能、存放位置都已经固定好了,不易变更
1.2.3 二进制安装
r 优点:简单、快
r 缺点:不能定制、包容量大
1.2.4 定制rpm包※
r 流程:根据需求编译软件==>制件rpm包==>搭建内网yum仓库==>yum安装
r 优点:结合编译安装与yum安装两者的优点
r 缺点 :rpm包的通用性差,只能适用于公司的环境,第一步编译安装复杂、打包后不能再次更改、一般人不会定制rpm包
1.3 RPM简介
英文全称是Red Hat Package Manager,即Red Hat包管理器。
几乎所有的Linux发行版本都使用这种形式的软件包管理安装、更新和卸载软件。
rpm命令有五种基本功能(但不包括创建软件包):安装、卸载、升级、查询、验证。
1.4 FPM打包工具
FPM的作者是jordansissel
FPM的GitHub:https://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安装
fpm是ruby写的,因此系统环境需要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/nginx1.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-instal1.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-devel1.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仓库搭建(且下下文分解!)