免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2483 | 回复: 7
打印 上一主题 下一主题

perl-磁盘阵列自动化脚本-请教 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-12-06 10:37 |只看该作者 |倒序浏览
有下面的配置文件config,内容如下:
vd0

adapter         0
fd0             0:0
fd1             0:1
fd2             0:2
raid            5

vd1

adapter         1
fd0             1:0
fd1             1:1
fd2             1:2
raid            6

这个是磁盘阵列raid的相关设置。具体要求:
通过此配置文件,完成一个perl脚本,脚本最终会转换为一个megacli的命令。为了方便,可以打印出来。
megacli -cfgldadd -r[磁盘阵列号][真实硬盘盘号] -a[适配器号]
比如
vd0

adapter         0
fd0             0:0
fd1             0:1
fd2             0:2
raid            5
这一段为转换为
megacli -cfgldadd -r5 [0:0,0:1,0:2] -a0


有兴趣的同学,可以写写,谢谢,下面是我的脚本


#!/usr/bin/perl
use strict;
use warnings;
my $conf = "config";

my $vdref;
my $index;
my $count;
open(FH,"<",$conf) or die "$!\n";
while(<FH>)
{
        chomp;
        if(/vd(\d+)/)
        {
                $index = $1;
                $count = 0;
        }
        if(/(adapter)\s+(\d+)/)
        {

                $vdref->{$index}->{$1} = $2;
        }
        if(/(fd\d+)\s+(.*)/)
        {
                #$vdref->{$index}->{$1}=$2;
                $vdref->{$index}->{$count}=$2;
                $count++;
        }
        $vdref->{$index}->{'cnt'} = $count;
        if(/(raid)\s+(\d)+/)
        {
                $vdref->{$index}->{$1} = $2;
        }
}
close(FH);
foreach my $external_key (sort keys %$vdref)
{
        foreach my $inner_key (sort keys %{$vdref->{$external_key}})
        {
       }
        #print "MegaCli -cfgldadd -r".$vdref->{$external_key}->{'raid'}."[ ";
        my $raid_arg;
        my $raid_arg = "-r".$vdref->{$external_key}->{'raid'}." [";
        my $temp;
        my @array;
        for(my $i = 0; $i < $vdref->{$external_key}->{'cnt'};$i++)
        {
                #print $vdref->{$external_key}->{$i}." ";
                push @array,$vdref->{$external_key}->{$i};
                $temp.=$vdref->{$external_key}->{$i};
        }
        #print "] -a".$vdref->{$external_key}->{'adapter'}."\n";
        #print "|---$temp---|\n";
        my $ret  = join ",",@array;
        #print "|---$ret---|\n";
        my $ret_ex  = $ret."] -a".$vdref->{$external_key}->{'adapter'};
        print "MegaCli -cfgldadd $raid_arg$ret_ex \n";
}

请有兴趣的朋友也做做,并分享下自己的代码和思路,谢谢。

论坛徽章:
0
2 [报告]
发表于 2010-12-06 11:32 |只看该作者
没朋友写写么,一起学习下。

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
3 [报告]
发表于 2010-12-06 11:39 |只看该作者
有下面的配置文件config,内容如下:
vd0

adapter         0
fd0             0:0
fd1             0 ...
peking_A_Liang 发表于 2010-12-06 10:37


改一下,这样应该简单多了....
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. my $conf = "config";

  5. my($index,$adapter, $raid);
  6. my $fd = "";
  7. my @aRaid;

  8. open(FH,"<",$conf) or die "$!\n";
  9. while(<FH>){
  10.     chomp;
  11.     if(/vd(\d+)/) {
  12.         $index = $1;
  13.     }
  14.     if(/adapter\s+(\d+)/) {
  15.         $adapter = $1;
  16.     }
  17.     if(/fd\d+\s+(.*)/) {
  18.         $fd .= "$1,";
  19.     }
  20.     if(/raid\s+(\d)+/) {
  21.         $raid = $1;
  22.         $fd =~ s/,$//;
  23.         push @aRaid, "megacli -cfgladd -r$raid [$fd] -a$adapter";
  24.         # or print it directly
  25.         $fd = "";
  26.     }
  27. }
  28. close(FH);
  29. foreach (@aRaid){
  30.   print "$_\n";
  31. }
复制代码
# perl config.pl
megacli -cfgladd -r5 [0:0,0:1,0:2] -a0
megacli -cfgladd -r6 [1:0,1:1,1:2] -a1

论坛徽章:
0
4 [报告]
发表于 2010-12-06 12:03 |只看该作者
回复 3# jason680


    嗯,谢谢,下午研究下你的思路。

论坛徽章:
0
5 [报告]
发表于 2010-12-06 12:09 |只看该作者
#!/usr/bin/perl -w
use strict;
my %status;
my ($key,$key1,$value);
while (<DATA>){
  next if /^$/;
  $key=$1 if /(vd\d)/;
  unless (/vd\d/){
  #print "$key\t";
  ($key1,$value)=split;
#print "$key1,$value\n";
  $status{$key}{$key1}=$value;
#  print "$key\t$key1\t$value\n";
}
}


#for (sort keys %status){
  #print "$_ => ";
  # my  $rec={};
   #$rec=$status{$_};
   #for (sort keys %$rec){
     #print "$_ => $rec->{$_}\n";
#}
}

#$,=",";
my @fd=join",", map{$status{vd0}->{$_}}qw/fd0 fd1 fd2/;
print "megacli -cfgldadd -r$status{vd0}->{raid} [@fd] -a$status{vd0}->{adapter}\n";

   
   
__DATA__
vd0

adapter         0
fd0             0:0
fd1             0:1
fd2             0:2
raid            5

vd1

adapter         1
fd0             1:0
fd1             1:1
fd2             1:2
raid            6

论坛徽章:
0
6 [报告]
发表于 2010-12-06 13:43 |只看该作者
回复 4# peking_A_Liang


    这个思路比较简单。代码维护性比较好。

论坛徽章:
0
7 [报告]
发表于 2010-12-06 13:47 |只看该作者
回复 5# liyangole


    这个思路和我的代码思路一样,以vd0,vd1之类的为外键,然后下面就是用空格来分隔vd下面的这些字段,前面的为内键,后面的为值。
另有个错误
map那行有错误。
map是对列表进行转换
比如my @arr = ("fd0","fd1","fd2");
print map{"|---".$_."---|\n"} @arr;
你那行join就在数组的元素之间插入逗号了,不需要在map了。

论坛徽章:
0
8 [报告]
发表于 2010-12-06 14:31 |只看该作者

  1. use strict;
  2. use warnings;
  3. use 5.010;
  4. my $rh_cfg = {};
  5. my $index;
  6. while(<DATA>)
  7. {
  8.         chomp;
  9.         next if /^\s*$/;
  10.         $index = $1 if /vd(\d+)$/;
  11.         my ($key,$value) = split /\s+/,$_;
  12.         $rh_cfg->{$index}->{$key} = $value if defined $key and defined $value;
  13. }
  14. print_cmd();

  15. sub print_cmd
  16. {
  17.         for my $index (keys %$rh_cfg)
  18.         {
  19.                 my $square_bracket = join ",",grep{/:/} sort values %{$rh_cfg->{$index}};
  20.                 my $last_arg = '-a'.$rh_cfg->{$index}->{adapter};
  21.                 my $cmd = 'megacli -cfgldadd -r'.$rh_cfg->{$index}->{raid}.' ['.$square_bracket.']'." $last_arg";
  22.                 say $cmd;
  23.         }
  24. }
  25. __DATA__
  26. vd0

  27. adapter         0
  28. fd0             0:0
  29. fd1             0:1
  30. fd2             0:2
  31. raid            5

  32. vd1

  33. adapter         1
  34. fd0             1:0
  35. fd1             1:1
  36. fd2             1:2
  37. raid            6
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP