应用场景:

最近由于开发同事需求,需要在各个区服的游戏配置文件中追加一个BI相关的redis配置信息。

如在app.conf.php中有如下字段

'redis_list' => array(

       'normal' => array(

           'host' => '192.168.5.7',

           'port' => 6382,

           'db' => 1

       ),  


现在需要在redis_list数组内增加一个bi_redis的配置,如下

 'redis_list' => array(

'bi_redis' => array(

'host' => '192.168.5.23',

'port' =>   6403,

'db' => 1

),

       'normal' => array(

           'host' => '192.168.5.7',

           'port' => 6382,

           'db' => 2

       ),  

   ),

线上大概有100个区服左右,也就是说需要在100个配置文件中去添加红色那段内容。全部手动添加肯定不行的,我首先想到的就是利用sed的 -i 参数更改文件,然后是利用sed的a参数追加内容,再结合ssh进行批量修改。

1.查看添加内容,但是不真正更改文件内容

 sed -n "/redis_list/a\   'bi_redis' => array( \n\t'host' => '192.168.5.23',\n\t 'port' => 6403,\n\t'db' => 1\n\t)," app.conf.php



2.更改文件内容,添加内容

sed -i "/redis_list/a\   'bi_redis' => array( \n\t'host' => '192.168.5.23',\n\t 'port' => 6403,\n\t'db' => 1\n\t)," app.conf.php


3.结合ssh更改其他主机上的app.conf.php

相关脚本:

ssh $user@$host "sed -i /redis_list/a\"'bi_redis' => array( \n\t 'host' => '192.168.5.23',\n\t 'port' =>   6403,\n\t 'db' => 1\n\t),\" $rootdir/config/app.conf.php"


4.将/data/zhanguo_app/目录下所有的app.conf.php文件中添加如上内容并检查语法

find /data/zhanguo_app/  -name app.conf.php -exec   sed -i "/redis_list/a\   'bi_redis' => array( \n\t'host' => '127.0.0.1',\n\t 'port' => 6380,\n\t'db' => 1\n\t)," {} \; -exec php -l {} \;


经验分享一下:

像这种需要批量修改文件的案例,首先要考虑的是能够通过脚本或工具进行修改,能不手动修改就不要手动修改。然后根据实际应用场景,想想思路,比如这里需要批量对app.conf.php文件添加内容,首先想到利用sed的-i 参数进行修改,然后通过sed的a参数进行追加内容。需要对多台服务器进行修改可以通过ssh或其他工具执行。这里sed结合使用shell变量和ssh,遇到的最大的问题就是单引号(')和双引号(")的正确处理,要不然没法达到需求。