虽然nginx也可以通过yum安装,但是如何使用源码包安装并自定义开启一些nginx功能模块,并且通过ansible下发到被管理集群呢?下面给给位看官提供一个具体实例以供参考。
首先我们需要手工编译好一台nginx服务器作为模板,再采用roles角色管理的方式将其解耦,并下发到被管理集群,具体步骤如下:
实验环境:
ansibleserver,nginx模板:(IP:192.168.252.130 centos7)
Mysqlserver: (IP:192.168.252.173 centos7)
Webserver: (IP:192.168.252.174 centos7)
1.手工编译安装一台nginx服务器,开启功能模块,配置好conf文件作为模板
--------安装依赖包-------------------
yum -y install pcre-devel zlib-devel gcc gcc-c++ //安装编译环境
useradd -M -s /sbin/nologin nginx //创建nginx管理用户
tar zxvf nginx-1.12.0.tar.gz -C /opt/ //解压nginx源码包(所用版本为1.12.0)
-----------编译----------------------
cd nginx-1.12.0/
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module
make && make install
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/ //创建软连接让系统识别nginx命令
脚本注释:--with-http_stub_status_module //支持状态统计
2.制作nginx开机自启动脚本
vi /etc/init.d/nginx
#!/bin/bash
#chkconfig: - 99 20
#description: Nginx Service Control Script
PROG="/usr/local/nginx/sbin/nginx"
PIDF="/usr/local/nginx/logs/nginx.pid"
case "$1" in
start)
$PROG
;;
stop)
kill -s QUIT $(cat $PIDF)
;;
restart)
$0 stop
$0 start
;;
reload)
kill -s HUP $(cat $PIDF)
;;
*)
echo "Usage: $0 {start|stop|restart|reload}"
exit 1
esac
exit 0
chmod +x /etc/init.d/nginx
chkconfig --add nginx
chkconfig --level 35 nginx on
systemctl start nginx
systemctl status nginx
至此nginx模板制作完成,下面开始编辑playbook(想了解更多nginx模块功能及常用优化请看这里)
cd /etc/ansible
cd roles/
mkdir -p {common,install}/{handlers,files,meta,tasks,templates,vars}
roles目录下有两个角色,common存放安装编译环境操作的文件,install存放安装nginx操作的文件。
common和install内各目录含义解释
files:用来存放由copy模块或script模块调用的文件。
templates:用来存放jinjia2模板,template模块会自动在此目录中寻找jinjia2模板文件。
tasks:此目录应当包含一个main.yml文件,用于定义此角色的任务列表,此文件可以使用include包含其它的位于此目录的task文件。
handlers:此目录应当包含一个main.yml文件,用于定义此角色中触发条件时执行的动作。
vars:此目录应当包含一个main.yml文件,用于定义此角色用到的变量。
defaults:此目录应当包含一个main.yml文件,用于为当前角色设定默认变量。
meta:此目录应当包含一个main.yml文件,用于定义此角色的特殊设定及其依赖关系。
把先前手工编译安装好的nginx目录打包,并放到install角色下的files下面,以及把启动脚本、配置文件放到templates下面
tar -czvf nginx.tar.gz --exclude "nginx.conf" --exclude "vhost" nginx/ //把除了nginx.conf 以外的文件打包命名为nginx
mv nginx.tar.gz /etc/ansible/roles/install/files/
cd /usr/local/nginx/
cp conf/nginx.conf /etc/ansible/roles/install/templates/
cp /etc/init.d/nginx /etc/ansible/roles/install/templates/
cd /etc/ansible/roles/common/tasks/
vim main.yml
- name: Install initializtion require software
yum: name="zlib-devel,pcre-devel,gcc,gcc-c++" state=latest
//定义common下的tasks为nginx下载依赖包
vim /etc/ansible/roles/install/vars/main.yml
nginx_user: nginx
nginx_port: 80
nginx_basedir: /usr/local/nginx
//定义intall下的vars,将nginx管理用户,端口,所在路径定义为变量方便以后调用
vim /etc/ansible/roles/install/tasks/copy.yml
name: Copy Nginx Software
copy: src=nginx.tar.gz dest=/opt/nginx.tar.gz owner=root group=root //将file文件夹下的nginx.tar.gz拷贝到/opt下,属主为root,所属组为root
- name: Uncompression Nginx Software
shell: tar zxf /opt/nginx.tar.gz -C /usr/local //解压文件包释放到/usr/local下 - name: Copy Nginx Start Script
template: src=nginx dest=/etc/init.d/nginx owner=root group=root mode=0755 //将启动脚本从install下的templates里复制到/etc/init.d下,属主为root,所属组为root组,并定义执行权限 - name: Copy Nginx Config
template: src=nginx.conf dest={{ nginx_basedir }}/conf/ owner=root group=root mode=0644//将配置文件nginx.conf复制到nginx所在目录下的/conf/文件夹
vim /etc/ansible/roles/install/tasks/copy.yml
- name: Create Nginx User
user: name={{ nginx_user }} state=present createhome=no shell=/sbin/nologin //给nginx创建管理用户 - name: Start Nginx Service
shell: /etc/init.d/nginx start //使用启动脚本启动nginx - name: Add Boot Start Nginx Service
shell: chkconfig --level 35 nginx on //设置3,5级别开机自启动 - name: Delete Nginx compression files
shell: rm -rf /opt/nginx.tar.gz //删除之前的压缩包
vim /etc/ansible/roles/install/tasks/main.yml
- include: copy.yml
-
include: install.yml
//在install角色下创建一个总的main.yml文件,调用copy.yml和install.yml
vim /etc/ansible/install.yml
- hosts: all
remote_user: root
gather_facts: True
roles:- common
- install
//在/etc/ansible/目录下创建nginx安装剧本nginx_install.yml调用roles下的common和install两个角色
至此我们手工编译安装nginx的playbook已经编写完成。
ansible-playbook nginx_install.yml --syntax -check//检查一下脚本中的语法
没有问题,ansible-playbook nginx_install.yml 执行剧本
然后去两台被管理端服务器查看nginx是否成功开启
systemctl status nginx.service
至此通过剧本实现手工编译安装nginx完成
原文地址:http://blog.51cto.com/13842738/2311978