Unix/Linux 系统自动化管理 系统更新篇(2)
- UID
- 1066743
|
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;
|
|
|
|
|
|
|