spring下设置七个条件安插文件,自动加载配置

by admin on 2019年9月11日

shell实战:用shell实现自动接收haproxy配置文件并加载,让配置生效

在开发过程中,我们经常需要搭建多个环境,开发环境,测试环境,预发布环境,生产环境。这个时候就会产生一个问题,对于一些系统配置,如数据源配置,远程调用地址等,不同环境的配置都是不一样的,代码升级发布的时候就常常需要切换配置,非常繁琐而且容易人工操作失误导致严重问题。

shell自动化配置hadoop配置文件示例

shell实战之:用shell实现squid守护进程

 

现在我们尝试利用spring的加载机制,让系统帮我们自动选择环境对应的配置。

 

 

001

首先将所有环境的配置一起放在多个properties文件中

[plain] 

01

haproxy的自动接收配置并加载

图片 1

#!/bin/bash  

用shell实现squid守护进程

002

可以看到,现在配置了开发环境和生产环境的配置文件了。接下来设置一个环境的标志,同样采用配置文件Environment.properties的形式

read -p ‘Please input the directory of hadoop , ex: /usr/hadoop :’
hadoop_dir  

02

关于后台接收配置进程功能介绍:

图片 2

if [ -d $hadoop_dir ] ; then  

每两分钟检测一下squid服务状态,如果squid服务不在了,则启动,达到守护的目的

003

然后,定义一个环境配置文件自动加载的bean,交由spring管理,这样系统启动的时候就会自动加载配置并读取相应的配置文件进来了

   echo ‘Yes , this directory exist.’  

03

1、是个while 1 后台进程

图片 3

else   

脚本如下:

004

接着,定义一个读取配置项的service

   echo ‘Error , this directory not exist.’  

04

2、目前是30s检查一次,是否有新的配置过来,有则继续,没有则休息30s,回到步骤1

图片 4

   exit 1  

#!/bin/sh

005

现在当需要使用配置项的时候,通过EnvironmentService读取就行了

fi  

05

3、如果有,则调用ha命令检查当前收到的配置文件是否在语法问题,如果没问题则继续,有问题,则发邮件告警,休息30s,回到步骤1

图片 5

  

#code by scpman

006

这样子,不论环境配置有多少,每次切换环境只需要改一下Environment.properties的环境标志就行了

if [ -f $hadoop_dir/conf/core-site.xml ];then  

06

4、没有语法问题,则将旧的配置文件备份出去,将新收到的文件,放到对应的位置。此时会检查下放过去的和收到的是否大小一致。不一致,退出并告警,休息30s,回到步骤1,大小一样,则继续

   echo “Now config the $hadoop_dir/conf/core-site.xml file.”  

#mail:[email protected]

007

   read -p ‘Please input the ip value of fs.default.name , i.e.
hdfs://ip:port :’ ip  

07

5、此时重新reload配置,休息1s,并调用系统命令检测ha服务是否正常存在,不正常,则重启ha进程,并告警,直到ha进程正常
6、最后将接收目录下的配置文件,备份到其他位置

   i=1  

#Blog:

008

   while [ -z $ip ]  

08

7、休息30s,进入下一次循环,回到步骤1

   do  

msgip=”10.0.1.111″

009

      read -p ‘Please input the ip value of fs.default.name , i.e.
hdfs://ip:port :’ ip  

09

实现如下:

      let i++   

IP=`cat /etc/rc.conf | grep -E “ifconfig_[em1|bce1]” | awk ‘{print
“IP:”$2}’| sed -n 1p `

010

      echo $i  

10

# cat haconf_recive.sh

      if [ $i -gt 2 ];then  

check_squid()

011

         echo ‘You have input three time , done , exit.’  

11

#!/bin/sh

         exit 1  

{

012

      fi  

12

#recive_server.sh

   done  

rs_flag=`ps uaxww | grep squid|grep -v grep | wc -l`

013

   if [ $ip = ” ];then   

13

#haproxy

      echo ‘The value of ip can not null , exit.’  

if [ “$rs_flag” -gt 0 ]

014

      exit 1  

14

#检测指定目录下是否有新配置文件过来,如果有配置文件,则检查语法,并重新加载服务

   fi   

then

015

   read -p “Please input the port value of fs.default.name , i.e.
hafs://$ip:port :” port  

15

#检测时,告警相关

   if [ $port = ” ];then   

        echo ‘squid server is running..’

016

      echo ‘The value of port can not null , exit.’  

16

#1、语法有错误时,邮件报警,服务加载失败时报警

      exit 1  

        exit;

017

   fi  

17

#全局变量

   read -p ‘Please input the dir value of hadoop.tmp.dir :’
hadoop_tmp_dir  

else

018

   if [ $hadoop_tmp_dir = ” ];then  

18

recive_path=’/usr/sa_yunwei/recive_doc/’

      echo ‘The value of hadoop.tmp.dir can not null , exit.’  

        echo ‘squid server is not running…’

019

      exit 1  

19

backup_path=’/usr/sa_yunwei/recive_backup/’

   else  

        /usr/local/squid/sbin/squid -z

020

      if [ ! -d $hadoop_tmp_dir ];then  

20

current_conf_file=’/etc/haproxy/haproxy.cfg’

         echo ‘The directory you have input is not exist , we will make
it.’  

        /usr/local/squid/sbin/squid -D

021

         mkdir -p $hadoop_tmp_dir  

21

nowtime=`date +”%Y-%m-%d %H:%M:%S”`

      fi  

        /usr/bin/logger -p local1.info -h $msgip “the services: $IP
squid will to start by watch_squid.sh “

022

   fi  

22

push_mail()

   tmp_dir=$(echo $hadoop_tmp_dir|sed ‘s:/:\\/:g’)  

        sleep 1

023

        

23

{

   sed -i “s/ip/$ip/g” $hadoop_dir/conf/core-site.xml  

        check_squid

024

   sed -i “s/port/$port/g” $hadoop_dir/conf/core-site.xml   

24

tag=$1

   sed -i “s/tmp_dir/$tmp_dir/g” $hadoop_dir/conf/core-site.xml  

fi

025

else   

25

local_ip=`ifconfig |grep “inet addr:10″|awk -F’:’ ‘{print $2}’|awk
‘{print $1}’`

   echo “The file $hadoop_dir/core-site.xml doen’t exist.”  

}

026

   exit 1  

26

zhengwen=”the haproxy:$local_ip at $nowtime haproxy conf $tag,please
check it”

fi  

check_squid

027

cat $hadoop_dir/conf/core-site.xml  

27

echo “$zhengwen” | /usr/bin/mail -s “haproxy alert: ${zhengwen}”
[email protected]

echo ‘Config the core-site.xml success !’  

每两分钟用定时实现,如果要1分钟检查一次,就是* * * * *了

028

echo   

28

}

关键部分分析:

定时如下

029

        1.   tmp_dir=$(echo $hadoop_tmp_dir|sed ‘s:/:\\/:g’)

29

#push_mail ‘reload faild!’

             
我们输入的$hadoop_tmp_dir是类似:/usr/hadoop/tmp这样的,如果直接写在sed里:sed
-i “s/tmp_dir/$hadoop_tmp_dir/g” $hadoop_dir/conf/core-site.xml
,这样会出现错误。因为它解析进去会是:sed -i
“s/tmp_dir//usr/hadoop/tmp/g”
$hadoop_dir/conf/core-site.xml这样的,显然不能满足,这里解决的方式是:想办法将/usr/hadoop/tmp的输入转换为:\
/usr\ /hadoop\/tmp的形式,即加入转义字符。sed ‘ s:/:\\/:g ‘
这样就可以了,然后通过$(),取值赋给变量。

*/2 * * * * su – root -c
“/usr/home/admin/mgr_shell/watch_squid.sh”

030

        2. sed -i ” s/ip/$ip/g ” $hadoop_dir/conf/core-site.xml    

 

check_path()

             这里就是所谓的对文件中字符串的替换,示例文件为:          
 

01
用shell实现squid守护进程 02
每两分钟检测一下squid服务状态,如果squid服务不在了,则启动,达到守护…

031

[plain] 

{

[email protected]:/home/houqd/hadoop/conf#
cat -n core-site.xml   

032

     1  <?xml version=”1.0″?>  

if [ -d $1 ]

     2  <?xml-stylesheet type=”text/xsl”
href=”configuration.xsl”?>  

033

     3    

then

     4  <!– Put site-specific property overrides in this file.
–>  

034

     5    

echo $1

     6  <configuration>  

035

     7      <property>  

else

     8          <name>fs.default.name</name>  

036

     9          <value>hdfs://ip:port</value>  

mkdir -p $1

    10      </property>  

037

    11      <property>  

fi

    12          <name>hadoop.tmp.dir</name>  

038

    13          <value>tmp_dir</value>  

}

    14      </property>  

039

    15  </configuration>  

check_path $recive_path

         3. 注意其它语法:   if [ ] ; then   else  fi          while
[] do  ..done         i=0   let i++

040

[plain]
#!/bin/bash read -p Please input the directory of hadoop , ex:
/usr/hadoop : hadoop_dir if [ -d $hadoop_dir ] ; then echo Yes
,…

check_path $backup_path

041

haproxy_shouhu()

042

{

043

pidof haproxy

044

if [ $? = 0 ]

045

then

046

    echo

047

else

048

    /etc/init.d/haproxy start

049

    sleep 1

050

    haproxy_shouhu

051

    push_mail ‘ha server will start by haproxy_shouhu’

052

fi

053

}

054

check_recive()

055

{

056

ntime=`date +”%Y%m%d”`

057

newkey=”new_${ntime}_haproxy.cfg”

058

rec_file=”$recive_path$newkey”

059

hacmd=`which haproxy`

060

reload_conf()

061

{

062

cp -rp $current_conf_file ${backup_path}`date
+”%Y%m%d%H%M%S”_haproxy.cfg`

063

cp -rp $rec_file $current_conf_file

064

a=`ls -l $current_conf_file |awk ‘{print $5}’`

065

b=`ls -l $rec_file |awk ‘{print $5}’`

066

if [ $a = $b ]

067

then

068

 /etc/init.d/haproxy reload

069

 haproxy_shouhu

070

 mv $rec_file ${backup_path}`date +”%Y%m%d%H%M%S”_haproxy.cfg_old`

071

else

072

    echo can not reload, $rec_file != $current_conf_file

073

fi

074

}

075

check_conf_parse()

076

{

077

$hacmd -f $rec_file -c

078

if [ $? = 0 ]

079

then

080

    echo recive file parse ok!now reload!

081

    reload_conf

082

else

083

    echo recive file parse faild!!

084

    push_mail ‘ha recive conf file yufa wrong!’

085

fi

086

}

087

if [ -f $rec_file ]

088

then

089

echo recive file: $rec_file

090

check_conf_parse

091

else

092

echo no recive file

093

fi

094

}

095

while [ 1 ]

096

do

097

        check_recive

098

        sleep 30

099

done

100

运行后样子如下

101

# sh haconf_recive.sh

102

/usr/sa_yunwei/recive_doc/

103

/usr/sa_yunwei/recive_backup/

104

no recive file #30s来一次

105

no recive file

106

no recive file

107

放到后台运行之

108

/bin/bash haconf_recive.sh 2>&1 &

109

这样就好了

110

服务端就算启动完成了

111

客户端怎样送配置过来呢?利用rsync推送过来

112

rsync配置文件如下:

113

# cat /etc/rsyncd.conf

114

uid = root

115

gid = root

116

use chroot = no

117

read only = true

118

max connections = 4

119

syslog facility = local5

120

pid file = /var/run/rsyncd.pid

121

log file = /var/log/rsyncd.log

122

  

123

hosts allow =10.0.0.0/8

124

[haconf]

125

path = /usr/sa_yunwei/recive_doc/

126

read only = no

127

rsync权限已经添加,推送命令如下: rsync -av 新生成的ha配置文件
10.0.4.2::haconf/

128

  

129

 新生成的配置文件规则:  new_当天日期_haproxy.cfg

130

  

131

 举个例子:  生成的新配置文件名new_20130827_haproxy.cfg  推送 rsync
-av new_20130827_haproxy.cfg  10.0.4.2::haconf/  
 只要将此文件推到对应机器,haproxy上会有后台进程(我们上面的脚本负责)负责接收

132

这样就实现的

133

haproxy的自动接收配置并加载。

 

001 haproxy的自动接收配置并加载 002 关于后台接收配置进程功能介绍:
0…

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图