首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Unix/Linux 系统自动化管理 系统更新篇(2)

Unix/Linux 系统自动化管理 系统更新篇(2)

自动化更新具体实现在大规模、多节点的 AIX/Linux 环境下,更新每个节点上的软件包或系统的时候,如果按照通常手动操作,先创建一个公共的软件仓库,然后在每个节点上添加软件仓库后,通过 nim/yum/yast 更新所指定的软件包或系统,就显得重复性比较多,工作量比较大,工作效率比较低;这个时候就需要一种新的效率更高,更便于操作的自动化升级与更新方法,它能在管理站上自动创建软件仓库,然后以多线程的方式远程并发地在每个节点上添加软件仓库,运行 nim/yum/yast 更新所指定的软件包或系统。
本章节将针对上面方法给出两个比较具体的自动化示例,分别用来进行 AIX、Redhat Enterprise Linux、SuSE 自动化升级与更新的示范;用户可以根据自身需求,在这些脚本的基础上进行扩展,实现更加复杂的管理功能。
图 1 上方 3 台为将要被远程部署节点,下方 1 台为管理站
图 1. 示范场景拓扑图注意:对于在下面实现脚本文件中调用的函数,为了文章的组织,都被统一放到了 updateScriptLib.perl 文件中,假如读者想运行下面的脚本,请先将使用的函数拷贝到相应的脚本文件中。
基于 NIM在 AIX 系统上运行的自动化代码由两个文件组成:(1)updateSW.conf、(2)updateAIXSW.pl。其中 updateSW.conf 存在于管理站上,包含需要更新的软件包的配置信息;updateAIXSW.pl 是一个可执行的 perl 代码,也运行于管理站上,主要解析 updateSW.conf,将获取的配置信息存于 hash 列表中,然后根据 hash 列表中的软件配置信息,启动多个进程分别通过 NIM 对每个节点进行远程自动化软件升级与更新。
  • updateSW.conf                          该文件主要包含软件包更新配置信息,其文件内容格式如下:
    # 更新软件包名:其所处位置:依赖列表:
    openssh:/usr/sys/inst.images:/usr/sys/inst.data/user_bundles/openssh.bnd
    openssl:/usr/sys/inst.images1: /usr/sys/inst.data/user_bundles1/openssl.bnd
  • updateAIXSW.pl 文件                         命令格式:updateAIXSW.pl – c SWConfName – n nodeName1, nodeName2, … .
    该可执行文件主要包含自动化升级与更新软件包代码:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    #!/usr/bin/perl
    use strict;

    #main()

    my $updateSWConf;
    my $pid;
    my @children;

    # 命令行参数解析
    if ($ARGV[0] eq "-c")
    {
        $updateSWConf = $ARGV[1];
        if( $updateSWConf eq "" )
        {
            $updateSWConf = "/etc/updateSW.conf";
        }
    }

    # 检查是否指定需要进行更新的节点
    if ( ($ARGV[2] ne "-n") || ($ARGV[2] eq "") || ($ARGV[3] eq "") )
    {
        print "pls specify the updated nodes with – n.\n";
    }

    my $argLine = $ARGV[3];

    chomp($argLine);

    my @nodeNameArray = split ",", $argLine;

    my %confHash = parseSWConf($updateSWConf);
    # 对节点列表进行轮循

    foreach my $nodeName (@nodeNameArray)
    {
        if ($nodeName eq "")
            continue;
       
        FORK:
        {
           # 针对每个节点创建多进程
           if ($pid = fork)
           {
                #parent, store pid in array
               push(@children, $pid);
            }
           elsif (defined $pid)
           {
               # 针对需要安装的包列表,进行轮循
               foreach my $SWPkgName (keys %confHash)
                {
                   my $location = $confHash{$SWPkgName}{"loc"};
                   my $bndLocation = $confHash{$SWPkgName}{"bnd"};
                   my $bundleName =  $SWPkgName . "_bundle";
                   my %failNodes = {};
                   my $tmpVal = 0;
                      
                   # 定义类型为 lpp_source 的资源
                runCmd("nim -o define -t lpp_source -a server=master -a \
                    location=$location $SWPkgName");
                   $tmpVal = $::RETVAL;
                   goto ERROR1 if $tmpVal;
            
                   # 定义类型为 installp_bundle 的资源
                 runCmd("nim -o define -t installp_bundle -a server=master -a \
                     location=$bndLocation $bundleName");
                   $tmpVal = $tmpVal || $::RETVAL;
                   goto ERROR2 if $tmpVal;
            
                   # 分配资源
                runCmd("nim -o allocate -a lpp_source=$SWPkgName -a \
                      installp_bundle=$bundleName $nodeName");
                   $tmpVal = $tmpVal || $::RETVAL;
                   goto ERROR3 if $tmpVal
            
                   # 进行节点更新
                   runCmd("nim -o update $nodeName");
                   $tmpVal = $tmpVal || $::RETVAL;
                   goto ERROR4 if $tmpVal;
            
                   print "Successfully update $SWPkgName on $nodeName.\n";
                   next;
               # 根据实际情况,进行错误处理
               ERROR4:
                   runCmd("nim -o deallocate $nodeName");
               ERROR3:
                   runCmd("nim -o remove $SWPkgName");
               ERROR2:
                   runCmd("nim -o remove $SWPkgName");
               ERROR1:
                   print " Fail to update $SWPkgName on $nodeName.\n";
                   exit $tmpVal;
               }
       
               exit 0;
           }
           else
           {
               #couldn't fork, can't use msg catalog since no
               # procs are available.
               printf "updateLinuxSW: Unable to fork child process.\n";
            }
       }#end of the fork
    }

    #wait until all children processes have ended.
    foreach $pid (@children)
    {
        waitpid($pid, 0);
    }

    undef @children;

    exit 0;




返回列表