且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

《懒人Shell脚本》之五——一键修改分布式系统配置文件

更新时间:2021-10-05 07:14:10

0. 背景

分布式部署程序的时候,近20台机器部署了同样的环境进行数据采集。
当更换程序时,能否修改好一套,其他机器只需要一步scp,一步执行脚本。
一键修改配置,正是本文的目的。

1、 实现要求
1、修改*.sh的可执行权限;
2、自动获取表名称的前两个字符,相应所有文件名称统一修改;
3、修改配置文件中的mysql表名、mysql地址;
4、从其他已有填好的配置中读取并修改java程序执行的start_num, end_id值。

2. 核心脚本如下

简化版本:

[root@localhost tt_process_detail]# cat change_conf_sim.sh
#需要手动修改
dst_mysql_ip="10.0.1.30"

processName=$(echo `pwd` | awk -F "/" '{print $4}')
city_code=`echo ${processName:0:2}`

find ./ -name "*.sh" | xargs chmod a+x

#自动修改名称
for((i=1;i<=4;i++))
do
  mv yt_ent_p${i} ${city_code}_ent_p${i}
done;

#自动生成
dst_table_name="${city_code}_company_info"

#循环实现
for((i=1;i<=4;i++))
do
#从旧表中获取start_num, end_id值
#读取指定行的数字部分
  p_begin=`sed -n 30p ../${city_code}_process/${city_code}_ent_p${i}/conf/configuration.xml | grep -o '[0-9]\+'`
  p_end=`sed -n 36p ../${city_code}_process/${city_code}_ent_p${i}/conf/configuration.xml | grep -o '[0-9]\+'`

 #将获取的旧表值写入到新表中
  sed -i "30s/<value>.*<\/value>/<value>${p_begin}<\/value>/" ./${city_code}_ent_p${i}/conf/configuration.xml
  sed -i "36s/<value>.*<\/value>/<value>${p_end}<\/value>/" ./${city_code}_ent_p${i}/conf/configuration.xml

  #修改配置
  sed -i "s#te_company_info#${dst_table_name}#g" ./${city_code}_ent_p${i}/conf/configuration.xml
  sed -i "s#10.8.5.10#${dst_mysql_ip}#g" ./${city_code}_ent_p${i}/conf/configuration.xml
done;

3. 变量嵌套变量举例

[root@localhost hz_process_detail]# cat test.sh
#!/bin/bash

p1_begin=11;
p2_begin=22;

for ((i=1;i<=2;i++))
do
  begin=p${i}_begin
  eval p_begin_no=$(echo \$$begin)
  echo $p_begin_no
done;

4.获取ip地址的方法:

[root@localhost tt_process_detail]# cat tt_ent_p1/conf/configuration.xml | grep "jdbc" | awk -F "/" {'print $3'}
10.0.1.30

4. 小结

1)能自动实现的,坚决不要手动修改。
2)20套程序,单纯手动修改,耗时近1个小时,包含排查错误、验证时间。
脚本实现,scp复制20套,各机器执行下脚本,10分钟之内搞定。
3)其中,关于shell下修改xml,***提到xmlstarlet工具,回头研究下。
本文使用的取指定行,写指定行的取巧的方式。


作者:铭毅天下
转载请标明出处,原文地址:
http://blog.csdn.net/laoyang360/article/details/52926943