前面的文章有salt的安装过程及salt模块,不清楚的可以去看一下,这篇主要是实现nginx+php 用logrotate来对日志进行切割,然后再简单的使用下salt这个工具;

架构如下:

 

以下.pp文件均在/etc/puppet/modules/logrotate/manifests下面,内容如下

init.pp

 

  1. class logrotate ( 
  2.         $backup_nginx     = "/data/backup/log/nginx"
  3.         $nginx_log        = "/data/log/nginx"
  4.         $nginx_pid        = "/usr/local/nginx/nginx.pid"
  5.         $base_cron        = "/home/cron/logrotate"
  6.        # $backup_nginx_dir = ["/data","/data/backup","/data/backup/log","/data/backup/log/nginx"], 
  7.        # $base_cron_dir    = ["/home/cron","/home/cron/logrotate"], 
  8.         $backup_php       = "/data/backup/log/php"
  9.         $php_log          = "/usr/local/php/var/log"
  10.         $php_pid          = "/usr/local/php/var/run/php-fpm.pid" 
  11.  
  12. ){ 
  13.         case $operatingsystem { 
  14.                 centos:{ 
  15.                         include logrotate::base 
  16.                         include logrotate::addcrons 
  17.                 } 
  18.         } 

base.pp

 

  1. class logrotate::base { 
  2.         package {"logrotate": 
  3.           ensure => present 
  4.         } 
  5.           
  6.       #  file {["/data","/data/backup","/data/backup/log","/data/backup/log/nginx"]: 
  7.          file {"$backup_nginx": 
  8.           ensure  => present, 
  9.         } 
  10.  
  11.       #  file {["/home/cron","/home/cron/logrotate"]: 
  12.          file {"$base_cron": 
  13.           ensure  => present, 
  14.         } 
  15.          
  16.         file {"$backup_php": 
  17.           ensure  => present 
  18.         } 

addcrons.pp

  1. class logrotate::addcrons { 
  2.         file {"logrotate_nginx_conf": 
  3.           owner   => root, 
  4.           group   => root, 
  5.           mode    => 644, 
  6.           path    => "/home/cron/logrotate/logrotate_nginx.conf", 
  7.           content => template('logrotate/logrotate_nginx_conf.erb'), 
  8.           require => Class["logrotate::base"] 
  9.         } 
  10.  
  11.         file {"logrotate_nginx_sh": 
  12.           owner   => root, 
  13.           group   => root, 
  14.           mode    => 644, 
  15.           path    => "/home/cron/logrotate/logrotate_nginx.sh", 
  16.           content => template('logrotate/logrotate_nginx_sh.erb'), 
  17.           require => Class["logrotate::base"] 
  18.         } 
  19.  
  20.         cron {"logrotate nginx": 
  21.           command   => "bash /home/cron/logrotate/logrotate_nginx.sh", 
  22.           user      => root, 
  23.           minute    => 59, 
  24.           hour      => 23, 
  25.           require   => File['logrotate_nginx_conf','logrotate_nginx_sh'] 
  26.         } 
  27.  
  28.         file {"logrotate_php_conf": 
  29.           owner   => root, 
  30.           group   => root, 
  31.           mode    => 644, 
  32.           path    => "/home/cron/logrotate/logrotate_php.conf", 
  33.           content => template('logrotate/logrotate_php_conf.erb'), 
  34.           require => Class["logrotate::base"] 
  35.         } 
  36.  
  37.         file {"logrotate_php_sh": 
  38.           owner   => root, 
  39.           group   => root, 
  40.           mode    => 644, 
  41.           path    => "/home/cron/logrotate/logrotate_php.sh", 
  42.           content => template('logrotate/logrotate_php_sh.erb'), 
  43.           require => Class["logrotate::base"] 
  44.         } 
  45.  
  46.         cron {"logrotate php": 
  47.           command   => "bash /home/cron/logrotate/logrotate_php.sh", 
  48.           user      => root, 
  49.           minute    => 59, 
  50.           hour      => 23, 
  51.           require   => File['logrotate_php_conf','logrotate_php_sh'] 
  52.         } 
  53.  

=================================

以下是四个.erb文件的内容

logrotate_nginx_conf.erb

  1. <%= nginx_log %>/*.log { 
  2.     daily 
  3.     rotate 7 
  4.     missingok 
  5.     dateext 
  6.     notifempty 
  7.     compress 
  8.     sharedscripts 
  9.     postrotate 
  10.     [ ! -f <%= nginx_pid %> ] || /bin/kill -USR1 `/bin/cat <%= nginx_pid %>
  11.     endscript 
  12.     } 

logrotate_nginx_sh.erb

  1. #!/bin/bash 
  2.  
  3. BACKUP_DIR=<%= backup_nginx %>  # nginx 备份日志目录 
  4. NGINX_LOG_PATH=<%= nginx_log %>      # nginx 原始日志目录 
  5. LOGROTATE_CONF_DIR=`dirname $0`    # logrotate 配置文件目录,默认跟本脚本同目录 
  6.  
  7. # 切割日志 
  8. /usr/sbin/logrotate -f $LOGROTATE_CONF_DIR/logrotate_nginx.conf 
  9.  
  10. if [ ! -d $BACKUP_DIR ]; then 
  11.     mkdir -p $BACKUP_DIR 
  12. fi 
  13.  
  14. # 对切割完的日志直接重定向压缩到 BACKUP_DIR 
  15. for log in `ls $NGINX_LOG_PATH/*-20[1-9][0-9][0,1][0-9][0-3][0-9].gz`; do 
  16.         mv $log $BACKUP_DIR/ 
  17. done 
  18.  
  19. # 删除7天前的 nginx 备份日志 
  20. find $BACKUP_DIR/* -name "*.gz" -mtime 7 -type f -exec rm -f {} \; 

logrotate_php_conf.erb

  1. <%= php_log %>/*.log { 
  2.    daily 
  3.    rotate 7 
  4.    missingok 
  5.    dateext 
  6.    notifempty 
  7.    compress 
  8.    sharedscripts 
  9.    postrotate 
  10.    [ ! -f <%= php_pid %> ] || /bin/kill -USR1 `/bin/cat <%= php_pid %>
  11.    endscript 
  12.    } 

logrotate_php_sh.erb

  1. #!/bin/bash 
  2.  
  3. BACKUP_DIR=<%= backup_php %>         # php 日志备份目录 
  4. PHP_LOG_PATH=<%= php_log %>              # php 日志原始目录 
  5. LOGROTATE_CONF_DIR=`dirname $0`         # logrotate 配置文件目录,默认跟本脚本同目录 
  6.  
  7. # 切割日志 
  8. /usr/sbin/logrotate -f $LOGROTATE_CONF_DIR/logrotate_php.conf 
  9.  
  10. if [ ! -d $BACKUP_DIR ]; then 
  11.     mkdir -p $BACKUP_DIR 
  12. fi 
  13.  
  14. # 对切割完日志进行重定向压缩到 BACKUP_DIR 
  15. for log in `ls $PHP_LOG_PATH/*-20[1-9][0-9][0,1][0-9][0-3][0-9].gz`; do 
  16.         mv $log $BACKUP_DIR/ 
  17. done 
  18.  
  19. # 删除7天前的备份日志 
  20. find $BACKUP_DIR/* -name "*.gz" -mtime 7 -type f -exec rm -f {} \; 

由base.pp可知我们是需要backup_nginx,backup_php,base_cron这些参数的目录,这个我们可以直接用salt命令来实现

 

salt 'slave.domain.com' cmd.run 'mkdir -p /data/backup/log/nginx&& /data/backup/log/php&& mkdir -p /home/cron/logrotate'
 
salt 'slave.domain.com' cmd.run 'puppet agent --test --server func.domain.com' 
下篇待续