rsync+inotify配置管理部署

前两篇把php+mysql+apache部署好了,项目中有一条需求是可以管理
系统中各个节点的配置文件,修改、重启并生效,本来这部分打算推给puppet配置管理工具
后来由于开发时间紧,没人去研究这个工具,就换了方案,下面简单介绍下方案:
各个节点的配置文件,比如nginx、apache、redis、memcached、还有java和php的一些应用
配置,统一有一个配置资源库,放在管理后台,在管理后台管理这个资源库,通过php修改文本内容,实现
修改配置文件这个需求点(其实就是file_put_content和file_get_content这两个函数),我们修改完了配置文件
需要传输到目标服务器上,文件传输的功能就交给rsync去解决,这样文件传输问题通过rsync解决了。
之后要介绍的是inotify,不愿意打字了,在网上摘抄一段,给大家解释下inotify能干什么:

——————————————————————————————————————————————————————

在日常工作中,人们往往需要知道在某些文件(夹)上都有那些变化,比如:

  • 通知配置文件的改变

  • 跟踪某些关键的系统文件的变化

  • 监控某个分区磁盘的整体使用情况

  • 系统崩溃时进行自动清理

  • 自动触发备份进程

  • 向服务器上传文件结束时发出通知

通常使用文件轮询的通知机制,但是这种机制只适用于经常改变的文件(因为它可以确保每过x秒就可以得到i/o),其他情况下都非常低效,并且有时候会丢失某些类型的变化,例如文件的修改时间没有改变。像Tripwire这样的数据完整性系统,它们基于时间调度来跟踪文件变化,但是如果想实时监控文件的变化的话,那么时间调度就束手无策了。Inotify就这样应运而生了。
———————————————————————————————————————————————————————

从上面可以看到inofity可以检测到文件是否更改,然后我们rsync同步时,会创建一些临时文件,
最后将文件通过move to的机制,来覆盖已经存在的文件,这样我们通过inofity就可以检测是否有
文件move to到我们指定文件的 文件名。然后执行重启或者重新加载配置脚本来实现重启生效。
完美满足需求,但是有缺点,在配置文件更改错误的时候,尤其像keepalived这种不检测配置文件是否正确
直接重启导致错误的配置文件无法正确运行,这个会影响很大。nginx和apache好说,如果配置文件不正确,重启
会不成功,仍然按照修改之前的配置文件进行。总结起来就是,无法验证重启是否成功,当然这些同样可以通过脚本来实现。
脚本什么的之后慢慢完善就好了,先看安装部署吧,这两个软件依赖不多,装起来相比php5.4轻松许多啊,主要就是调整,
不过对于软贱攻城师来说,重装个10几次算是什么问题呢!我多嘴了。。。。



首先安装rsync吧,不互相影响,先装哪个无所谓!
rsync下载:http://rsync.samba.org/ftp/rsync/
rsync-3.0.9.tar.gz

首先确认Linux系统中是否装了基础软件gcc、make、perl
楼主也没装过,直接用yum了!

  1. tar -zxvf rsync-3.0.9.tar.gz

  2. cd rsync-3.0.9

  3. ./configure --prefix=/usr/local/rsync

  4. make && make install

rsync是服务器间传递文件的,当然需要安装两台服务器喽!
另一台机器安装方式一样!

好!两台机器现在已经安装完毕,开始配置rsync,同步成功就OK!

先上总体流程图:需要同步的服务器如下图:

只是简略的画了一下需要管理什么配置,实际上还有很多问题,比如跨机房配置库同步问题等,当然这里介绍配置管理!

当然现在只是部署阶段只要调通就OK,所以选择两台服务器,资源库服务器命名为A服务器,其他服务器命名为B服务器。

楼主采用在管理配置A机器上往B机器推文件的方式来使用rsync,因为需要手动推呀,
这样A机器的rsync就不需要配置了rsync配置文件了,只要能用就行,通过脚本认证的话需要建立一个密码文件,就是个文本文件。

在B服务器上修改rsync配置
vi /etc/rsyncd.conf    #这货默认是没有的,自己创建一个吧

  1. #全局选项

  2. strict modes = yes #是否检查口令文件的权限

  3. port = 873 #默认端口873

  4. log file = /usr/local/rsync/log #日志记录文件 原文中有的,我没有使用,日志文件

  5. pid file = /usr/local/rsync/rsyncd.pid #运行进程的ID写到哪里 原文中有的,我没有使用,日志文件


  6. [nginx]

  7. max connections = 5 #最大连接数

  8. uid = web #指定该模块传输文件时守护进程应该具有的uid

  9. gid = web #指定该模块传输文件时守护进程应该具有的gid

  10. path = /data/app # 传文件的目录

  11. ignore errors # 可以忽略一些无关的IO错误

  12. read only = no #no客户端可上传文件,yes只读

  13. write only = yes #no客户端可下载文件,yes不能下载

  14. hosts allow = * #充许任何主机连接

  15. #hosts deny = xx.xx.xx.xx #禁止指定的主机连接

  16. auth users = neusoft # 认证的用户名,如果没有这行,则表明是匿名

  17. secrets file= /etc/rsync_secure.pass # 指定认证口令文件位置


配置项一定要写对,刚才secrets file我少写了个file,提示我认证失败,看了好久,后来还是没相信
自己的双手,对比了一下配置文件,发现少写了个file,调半天啊!
然后建立认证口令文件。

  1. vi /etc/rsync_secure.pass


  2. neusoft:111111 


  3. #暴露身份了....


  4. :wq


  5. chmod 600 /etc/rsync_secure.pass

然后启动rsync守护进程

  1. /usr/local/rsync/bin/rsync --daemon


这里遇到一个坑,把密码文件的权限 


  1. chown web:web /etc/rsync_secure.pass

  2. su - web

  3. /usr/local/rsync/bin/rsync --daemon

进程怎么都无法启动,后来又将密码权限改回 root:root
启动成功了,不知道是不是rsync服务器端只能用root启动,有待验证。
服务器端启动成功了,修改iptables配置,开启873端口


  1. service iptables save

  2. vi /etc/sysconfig/iptables


  3. #增加这么一段,其实我是模仿22端口写的

  4. -A INPUT -p tcp -m state --state NEW -m tcp --dport 873 -j ACCEPT


  5. service iptables restart

这样该机器的873端口就可以被访问了!

然后回到A机器,也就是资源库服务器,执行命令

  1. /usr/local/rsync/bin/rsync -vzrtopg --progress /data/app/esb_admin/rsync/hd.sh neusoft@10.70.33.32::nginx

需要输入密码,输入刚才设置的 111111 
出现了!!!

  1. sending incremental file list

  2. hd.sh

  3.         1052 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1)


  4. sent 604 bytes received 27 bytes 1262.00 bytes/sec


说明同步成功了,到B机器的目录下,/data/app,发现增加了hd.sh文件,说明成功了!
注明一下:/data/app文件夹权限是所属web:web的,不然会出现不让操作文件的错误。同步的之后也可以指定密码文件,请看下面的命令:

  1. /usr/local/rsync/bin/rsync -vzrtopg --progress /data/app/esb_admin/rsync/hd.sh neusoft@10.70.33.32::nginx --password-file=/da

  2. ta/app/esb_admin/rsync/rsync.pass

这个密码文件也需要给予600,并且在A机器上,用哪个用户执行,这个密码文件就应该属于哪个用户。


  1. vi /data/app/esb_admin/rsync/rsync.pass


  2. 111111


  3. #里面只存了密码哦

rsync可以推文件,可以拉文件,还有好多功能,请读者自行研究喽,楼主看了一篇文章就学会了,附上地址:
http://www.iteye.com/topic/604436


rsync安装完毕~~~~!!!!下面是inotify!
首先看看机器是否支持inotify

出现下面的三行说明OK~~~

开始安装inotify,安装过程依旧很容易!

  1. tar -zxvf inotify-tools-3.14.tar.gz

  2. cd inotify-tools-3.14

  3. ./configure --prefix=/usr/local/inotify

  4. make && make install

然后编写一个脚本:inotify_watch.sh
inotify检测一个文件夹内是否有改动脚本如下

  1. #!/bin/sh

  2. configdir="/data/app/rsynctest"

  3. /usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y-%H:%M' --format '%T %w%f%e' ${configdir} | while read file

  4. do

  5. echo $file

  6. done

保存退出!给予执行权限,然后执行该脚本,如下图哦!(顺带着在A机器上执行rsync同步)


看图发现rsync执行同步的时候,最后一步是将生成的文件MOVED_TO,然后脚本就变成这样了:

  1. #!/bin/bash

  2. configdir="/data/app/lightesb_transmit/conf/"

  3. configfile="esb.conf"

  4. order="/usr/local/openresty/nginx/sbin/nginx -s reload"

  5. logdir="/data/app/inotify.log"


  6. /usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y-%H:%M' --format '%T %w%f%e' ${configdir} | while read file

  7. do

  8. ok=`echo $file | grep -q MOVED_TO && echo 1 || echo 0`

  9. if [ "$ok" == "1" ]; then

  10. $order 2>&1

  11. echo `date '+%Y-%m-%d %T'` >> $logdir

  12. echo $order >> $logdir

  13. echo '----------------------------------------------------------------------------' >> $logdir 

  14. fi

  15. done

增加了输出日志的模块,增加了执行的重新加载配置的命令,
以上脚本的含义就是就是如果发现有MOVED_TO就执行重新加载nginx配置文件,
以上配置管理功能完成了。

然后在资源库中,用php自己写了一个配置管理的页面,来管理各种配置,形成了满足需求的配置管理工具!
以上~~~~~












本文转自ljianbing51CTO博客,原文链接:http://blog.51cto.com/ljianbing/1617621 ,如需转载请自行联系原作者



上一篇:【学习记录】《DeepLearning.ai》第三课:浅层神经网络(Shallow neural networks)


下一篇:【学习记录】《DeepLearning.ai》第五课 深度学习的实践层面