免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 无风之谷

[其他] 讨论:如何同步上百/千台服务器的某一个配置文件?(获奖名单已公布-2012-9-6) [复制链接]

论坛徽章:
0
发表于 2012-07-06 22:04 |显示全部楼层
scp 或者rsync吧

论坛徽章:
0
发表于 2012-07-06 22:25 |显示全部楼层
我们以前用rdist来同步,不过就十多台机器,上千的话的确难处理

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
发表于 2012-07-07 08:35 |显示全部楼层
回复 1# 无风之谷
友情帮顶!

   

论坛徽章:
20
CU大牛徽章
日期:2013-03-13 15:29:072015亚冠之阿尔希拉尔
日期:2015-09-12 09:33:562015年亚冠纪念徽章
日期:2015-09-22 17:12:202015亚冠之本尤德科
日期:2015-10-29 16:18:18神斗士
日期:2015-11-23 13:37:23青铜圣斗士
日期:2015-12-07 10:14:28平安夜徽章
日期:2015-12-26 00:06:3015-16赛季CBA联赛之佛山
日期:2016-01-18 08:59:06shanzhi
日期:2016-06-17 17:59:3115-16赛季CBA联赛之同曦
日期:2016-11-03 14:43:552015七夕节徽章
日期:2015-08-21 11:06:17丑牛
日期:2014-12-30 16:06:17
发表于 2012-07-07 12:42 |显示全部楼层
前来学习         

论坛徽章:
0
发表于 2012-07-07 13:42 |显示全部楼层
来学习的~~顶~~~

论坛徽章:
0
发表于 2012-07-07 15:19 |显示全部楼层
个人用bash shell + expect 来解决的思路:

首先用shell-1来循环IP,对配置文件中IP对应的服务器建立ssh信任关系。这样就免去输入密码的麻烦
然后再用shell-2来循环IP,并调用expect文件,expect主要作用就是执行scp或者用户自定义的同步程序。
当然,shell-2中应该进行执行结果的判断,这样便于查看操作结果。
这样考虑下来。总共需要1个IP配置文件,2个shell脚本文件。1个expect文件。
关于expect,可以考虑在shell中使用多进程的方式来调用。这样可以加快同步速度。

以上思路之前在单位线上系统做过。是用来同步业务上几十台服务器的日志的。原理应该都是差不多的,只是没做同步结果的逻辑处理。

论坛徽章:
0
发表于 2012-07-07 16:47 |显示全部楼层
回复 46# helpid

对,你的思路挺好的。

不过我觉得没有必要建立ssh信任关系呢? expect本身是一个交互式的脚本,自动响应输入用户名密码自然不在话下啊。

一个shell 后台运行多个expect可以轻松搞定,不过需要注意的是分发机器是否能够承受得起同时发送多文件。



   

论坛徽章:
0
发表于 2012-07-07 17:53 |显示全部楼层
我希望是用 linux c 来实现,这样非常的灵活和方便,

如A机器有最新的配置文件,然后有个待更新机器的ip和端口列表,这列表机器每台机器开一个监听端口,
当A机器的配置文件已经更新,则把这个配置文件生成一个Md5值,一台一台的给列表里的机器发送,如果列表中有L1,L2,L3。。。。

当L1接收到这个Md5值,就和本地的比较,如果不一样,就向A发送请求最新的配置文件,然后A给有需求的机器发送最新的配置文件。。。。。。

我想要实现这个不难。

论坛徽章:
0
发表于 2012-07-07 18:04 |显示全部楼层
1,采用sshkey 公钥认证的方式,写个for 循环shell脚本,逐一分发下去。具体实现方式搜索下linux sshkey无密码认证登录。
2,个人建议用puppet,权限很清晰,策略管理很灵活,大型服务器集群管理起来非常的方便。主要就是配置puppet较为复杂,本人现在就用。
3,expect 脚本的话,如下
#!/usr/bin/expect -f
set IP [lindex $argv 0] #获取ip
set PASSWORD [lindex $argv 1] #获取密码
set timeout 20
spawn scp /etc/ssh/sshd_config root@$IP:/etc/ssh#同步配置文件
expect {
  "yes/no" {  #判断是否第一次登陆
  send "yes\n"
  expect "password:"
  send "$PASSWORD\n"
  }
  "password:" { send "$PASSWORD\n"
  }
}
sleep 2
expect "]*" #获取ps1
send "/etc/init.d/sshd restart  \n" #重启服务
sleep 1
send "exit \n" 退出
expect eof
完成expect 脚本后,再写个shell for循环
#!/bin/bash
for i in `cat ip_pass.log` #读入服务器ip与密码
ip="`echo $i |awk -F: '{print $1}'`"
ps="`echo $i |awk -F: '{print $2}'`"
do
./sync_conf.exp $IP $PASSWORD
sleep 2
done
exit 0
ip_pass.log 文件格式为 192.168.2.2:passwd
大致的思路就是,先写expect 脚本,将配置文件同步至服务器,输入密码,再重启服务。
然后用shell脚本读入服务器密码,与ip.
缺点就是如果同步大量服务器时间会比较过长。

论坛徽章:
0
发表于 2012-07-07 21:33 |显示全部楼层
个人的一些想法,不知道是否正确,请大家指教。

我们应该有一台更新服务器,运行着Web.py HTTP服务。这个Web应用程序使用MySQL保存数据,数据有两类,一类是client信息,记录客户端的IP地址,最后更新的补丁等等。另一类是patch信息,记录所有可以可以更新的补丁。

在客户端设置cron排程,半小时访问一次更新服务器,访问时带上客户端IP地址。Web服务器通过client表可以获取该IP地址需要执行的所有patch,可能不止一个。将需要执行的patch压缩返回给客户端。客户端下载到压缩包后解开到临时目录,然后执行压缩包中的安装文件install.py。

我认为有这样的好处:
1. Web服务器集中更新时可以用负责均衡技术,几千台服务器对于Web服务器来说不是太大的问题。
2. 可以集中管理控制client和patch,可以查询客户端的当前补丁执行情况。客户端安装好一个补丁后应该需要回馈一个信息给服务器,这样服务器才能知道客户端的具体安装情况,是否成功安装。
3. 特殊情况下,可以打开客户端SSH服务,让服务器直接访问某个客户端,将补丁推给客户端,实现某些补丁的立即更新。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP