情况是这样的,我管理着一个集群,有时需要更新这集群上的项目,每次手动写循环很烦人,不停的搞键盘,很累人,下面这个脚本可以让我偷偷懒,同时也减少了出错的机率,其实我使用这个脚本一段时间了,前一段时间我的工作站出了问题,一不要心将分区表删了,丢了一些资料,包括运行这个脚本的环境。花了两个小时重新写了这个脚本,赶快贴出来,下次系统崩溃后还能用得上,呵呵!
我将脚本命令为upfile.pl,放在/root/syncproject/目录下,同时这个目录下放着多个项目文件夹及一个log文件夹,远端主机上的/home/project/下存放有项目文件,我要保持本地/root/syncproject/目录下的项目是新的,然后运行脚本:
[root@supersun.biz syncproject]#./upfile.pl -h host1,host2 -p project1
这样就可以更新host1和host2上的project1项目了,rsync生成的日志保存到log文件夹下。
脚本很简单,但对于我来说挺实用。平时就应该简化自己的工作。
#!/usr/bin/perl
use strict;
use Getopt::Std;
#定义默认变量
use vars qw/
$LOCAL_PATH
$REMOTE_PATH
$LOG_PATH
@HOST_LIST
@PROJECTS
$PROJECT_NAME
/;
#本地的项目存储路径
#远端的项目存储路径
#日志存诸路径
#默认的主机列表
#可使用的项目名称
$LOCAL_PATH="/root/syncproject/";
$REMOTE_PATH="/home/project/";
$LOG_PATH="/root/syncproject/";
@HOST_LIST=qw/host1 host2 host3/;
@PROJECTS=qw/project1 project2/;
#定义命令行选项
#h 主机列表hosts
#p 项目名project
my %opts;
getopt("hp",\%opts);
#处理命令行传入的主机列表
@HOST_LIST=split /,/,$opts{h} if defined $opts{h};
#检查命令行传入的项目名是否可用
if(defined $opts{p}) {
$PROJECT_NAME=$opts{p};
my %TEST_PROJECTS;
@TEST_PROJECTS{@PROJECTS}=@PROJECTS;
unless(exists $TEST_PROJECTS{$PROJECT_NAME}){
print "错误的项目名:$PROJECT_NAME\n可用的项目名:@PROJECTS\n";
useage();
}
}else{
print "项目名未定义\n";
useage();
}
#生成命令行,并fork多进程进行更新
foreach my $HOST(@HOST_LIST){
my $COMMAND="rsync -av --delete ".$LOCAL_PATH.$PROJECT_NAME."/ ".$HOST.":"
.$REMOTE_PATH.$PROJECT_NAME."/";
if(fork){
print "更新$HOST上的$PROJECT_NAME\n";
print "Command:$COMMAND\n";
}else{
my $output=`$COMMAND`;
if($? eq 0){
print "$HOST更新成功\n";
my $file=$LOG_PATH."log/".$HOST;
open FD,'>',$file;
print FD join "\n",map $_="$HOST:$_",split /\n/,$output;
print FD "\n";
close FD;
}else{
print "$HOST更新失败\n";
print join "\n",map $_="$HOST:$_",split /\n/,$output;
print "\n";
}
exit;
}
}
#等待子进程
1 while wait_a_kid;
#等待子进程的例程
sub wait_a_kid {
my $pid=wait;
return 0 if $pid<0;
1
}
#使用说明
sub useage {
die "$0 [-h host1,host2,host3...] -p PROJECT_NAME\n";
}
还没到年终的时候我就提醒自己早点写年终总结,但还是拖到现在,拖到该交年终总结的前一天。其实也不是忙才拖到现在,而是因为懒,从上学开始就讨厌写东西,真是不忍去想以前在校读书时作文课是怎么过的。
以下就是憋了老半天才写完的年终总结了:
个人年终总结
2007年业已过去,在此,回顾一下在过去的一年里所做的工作,总结一下工作中的得失,以利用在新的一年里更好的开展工作,保留好的工作习惯,弥补不足,提高工作效率,为公司创造良好的网络环境及提高个人的技术水平。
在过去一年的里,公司的网络工作重点在于网络维护上,在此我将工作中的网络维护工作分为以下几类:
机房管理
每天早晚准时检查机房的环境状况,保证机房恒温恒湿,偶尔发现机房内空调出现故障时尽快联系相关厂商进行修理;
关注设备的运行状况,当服务器及网络设备报警,迅速进行检修;
对新购进的服务器的操作系统的安装、服务架设及上架等事务。
系统部署更新
配合网站管理的同事搭建及调整内容管理系统;
xx信息管理系统和xx系统的部署更新;
xx网xx论坛的搭建及调整等;
xx系统、xx系统、xx系统、xx评估系统、xx系统等的部署和更新;
监控系统及网络安全:
在xx同事的技术支持下搭建DWIT系统运行质量监控系统,记录系统运行的性能参数,并生成统计图,更直观的反应出系统的运行状况;
搭建CACTI系统性能监控系统,此套系统的功能与DWIT系统运行质量监控系统的功能有些重叠,但此套系统在图形管理方面更优秀,便于系统的管理;
搭建NAGIOS主机服务监控系统,监控各台服务器及服务器上所运行服务的监控;
搭建时间服务器同步服务器时钟,便于更准确的了解服务器的运行状况;
建立中央日志主机,将服务器的日志统一发送到日志主机进行分析和处理,同时也将防火墙的日志发送到日志主机,这样可以在较好的了解网络的运行状况。
构建防火墙访问规则,禁止非授权用户的访问;
使用端口扫描程序、漏洞扫描程序对运行中的系统进行检测,发现漏洞及时修补;
备份管理
定期执行所运行项目应用系统的备份,包括xx论坛等;
各应用系统所用到的数据库的备份,如:xx系统、xx管理系统;
个别应用系统数据的导出和同步;
服务的维护
监控集群的运行状况,保证集群中各台主机的负载的均衡,发现个别节点服务中断,迅速检查服务中断原因,并最快时间启用服务;
根据业务需求,增加减小集群中的服务器,及调整集群的参数;
网站静态网页的上传更新,以及后来搭建FTP服务器,由网站管理人员更新网站页面信息,站点下线后对原站点数据的备份存档;
管理公司的邮件服务器,并对服务器上文件服务的管理,包括过期文件的清理,更新常用的应用软件等;
尽可能的实现网络管理、系统管理工作的自动化以减少工作中的失误,包括编写各种系统管理脚本,应用优秀的系统管理工具;
技术支持
整理常用应用软件到文件服务器了,便于大家下载使用;
帮助同事杀毒防毒及修复受损的操作系统;
在进行会议支持的过程中,进行局域网的组建及其他技术支持;
对运行部门同事的网络基础知识的培训。
以上就是我在过去一年中我完成的一些工作,发现自己在网络工作的文档化方面还有所欠缺,希望在新的一年中能弥补此不足,更好的完善公司的网络环境。
supersun
2008年1月14日
关于时间服务
Network Time Protocol(NTP,网络时间协议)用于同步它所有客户端时钟的服务。NTP服务器将本地系统的时钟与一个公共的NTP服务器同步然后作为时间主机提供服务,使本地网络的所有客户端能同步时钟。
同步时钟最大的好处就是相关系统上日志文件中的数据,如果网络中使用中央日志主机集中管理日志,得到的日志结果就更能反映真实情况。在同步了时钟的网络中,集中式的性能监控、服务监控系统能实时的反应系统信息,系统管理员可以快速的检测和解决系统错误。
安装配置NTP服务
下面将介绍NTP服务器的简单配置:
一般的Linux发行版都会带ntp软件包,如果你的系统中还没有安装,就使用rpm命令安装此包,以下以fedora core 6系统为例配置一台时间服务器:
[root@supersun.biz root]# rpm -ivh ntp-4.2.2p1-3.i386.rpm
warning: ntp-4.2.2p1-3.i386.rpm: V3 DSA signature: NOKEY, key ID db42a60e
Preparing... ########################################### [100%]
1:ntp ########################################### [100%]
编辑配置文件/etc/ntp.conf
restrict default nomodify notrap noquery
restrict 127.0.0.1
restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
restrict 192.168.0.0 mask 255.255.255.0 nomodify notrap
server 0.asia.pool.ntp.org
server 1.asia.pool.ntp.org
server 2.asia.pool.ntp.org
server 3.asia.pool.ntp.org
server 127.127.1.0
fudge 127.127.1.0 stratum 10
斜体部分是我添加的部分,设定可以使用时间服务器的两个网段的内网地址及使用的外部的时间服务器。现在我们对配置做一个简要的解释:
第一行restrict、default定义默认访问规则,nomodify禁止远程主机修改本地服务器配置,notrap拒绝特殊的ntpdq捕获消息,noquery拒绝btodq/ntpdc查询(这里的查询是服务器本身状态查询)。
配置文件的最后两行作用是当服务器与公用的时间服务器失去联系时以本地时间为客户端提供时间服务。
端口
ntp使用udp协议,记得开放其123端口。
启动NTPD
启动ntpd守护进程:
service ntpd start
客户端的配置
以root身份运行周期性任务:
[root@supersun root]# crontab -e
添加以下内容,每15分钟更新一下时间:
*/15 * * * * ntpdate ntp.supersun.biz
此处的ntpdate命令包含在ntp软件包中,记得确认系统中是否已安装。
nagios默认使用mail发送邮件通知,系统如果关闭sendmail的话,邮件就不会被发出去,因此我写了一个用Perl脚本,通过Email::Send模块来发送邮件通知。
我将这个脚本命名为notify_via_smtp,并将其保存在Nagios安装目录的libexec目录下,脚本内容如下:
#!/usr/bin/perl -w
use strict;
use Email::Send;
use Getopt::Std;
my %opts;
getopt('ts',\%opts);
my $subject=$opts{s};
my $receiver=$opts{t};
my $sender='nagios@supersun.biz';
my $string=join '',<>;
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime;
$year+=1900;
my @month=qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec);
my @week=qw(Sun Mon Tue Wed Thu Fri Sat);
my $time=$week[$wday].",".$mday.' '.$month[$mon].' '.$year.' '.$hour.':'.$min.':'.$sec.' +0800';
my $msg=<< "__MESSAGE__";
To: $receiver
From: $sender
Subject: $subject
Date: $time
$string
__MESSAGE__
my $sendit= Email::Send->new({mailer => 'SMTP'});
$sendit->mailer_args([Host => 'smtp.supersun.biz']);
$sendit->send($msg);
注意加粗字体部分变更为你自定义的配置。
然后定义command,即编缉Nagios安装目录下的etc/command.cfg文件或者添到自定义的命令文件中,内容如下:
define command{
command_name host-notify-by-smtp
command_line /usr/bin/printf "%b" "***** Nagios 2.10 *****\n\nNotification Type: $NOTIFICATIONTYPE$\nHost: $HOSTNAME$\nState: $HOSTSTATE$\nAddress: $HOSTADDRESS$\nInfo: $HOSTOUTPUT$\n\nDate/Time: $LONGDATETIME$\n" | $USER1$/notify_via_smtp -s "Host $HOSTSTATE$ alert for $HOSTNAME$!" -t $CONTACTEMAIL$
}
define command{
command_name notify-by-smtp
command_line /usr/bin/printf "%b" "***** Nagios 2.10 *****\n\nNotification Type: $NOTIFICATIONTYPE$\n\nService: $SERVICEDESC$\nHost: $HOSTALIAS$\nAddress: $HOSTADDRESS$\nState: $SERVICESTATE$\n\nDate/Time: $LONGDATETIME$\n\nAdditional Info:\n\n$SERVICEOUTPUT$" | $USER1$/notify_via_smtp -s "** $NOTIFICATIONTYPE$ alert - $HOSTALIAS$/$SERVICEDESC$ is $SERVICESTATE$ **" -t $CONTACTEMAIL$
}
然后定义联系人:
define contact{
contact_name supersun
alias supersun
service_notification_period 24x7
host_notification_period 24x7
service_notification_options w,u,c,r
host_notification_options d,r
service_notification_commands notify-by-smtp
host_notification_commands host-notify-by-smtp
email supersun@supersun.biz
}