歡迎您光臨本站 註冊首頁

Unix/Linux 系統自動化管理: 系統更新篇

←手機掃碼閱讀     火星人 @ 2014-03-12 , reply:0
  
系統升級與更新是Unix/Linux系統管理中一個非常重要的組成部分。它可以增強系統的功能,讓系統更好地發揮起最大性能,同時也能修補系統的漏洞,增強系統的穩定性和安全性,防止系統遭到病毒或黑客的攻擊與破壞。一般來說,不同的操作系統系統都採用了不一樣的系統升級與更新方法。本文將介紹Unix/Linux操作系統上幾種常用的系統升級與更新方法,並在針對於它們的自動化腳本實現方面作了一些嘗試,希望對讀者能起到一些拋磚引玉的作用。

您可以通過訪問"系列文章:Unix/Linux 系統自動化管理”來了解更多和自動化管理相關的內容:

  • 系列文章:Unix/Linux 系統自動化管理

 

幾種升級與更新方法介紹

系統自動化升級與更新是操作系統所應具備的一項目重要功能。Unix/Linux 當前主流的系統更新方式主要有以下幾種:

NIM

NIM(Network Installation Manager),是 AIX 系統上提供的管理軟體安裝的伺服器。NIM 採用的是常見的 server/client 架構,一個 NIM 環境中需要至少一台 master 控制機,以及另外的需要安裝部署的客戶機。其中,master 上包含了安裝所需要的各種資源,比如安裝介質,客戶機信息,安裝配置文件等等,主控機就根據這些資源,為不同的客戶機安裝不同的操作系統及軟體。

NIM 安裝管理器不僅僅能夠按照 AIX 操作系統,還可以按照 linux 操作系統及 rpm 軟體包,其他的操作系統還不能支持。因此,NIM 可以支持 bff 和 rpm 軟體包的安裝與更新。

與其他操作系統所提供的自動安裝程序相比,NIM 帶有更為強大的功能,它不僅能夠實現操作系統的自動安裝,還可以任意安裝任意的第三方程序,既可以在客戶機安裝操作系統的時候安裝,也可以在操作系統安裝后安裝,只需要在 master 上指定軟體包的位置和安裝列表,所有的客戶機可以同時安裝它們。此外,NIM 還支持使用操作系統鏡像來安裝,NIM 會備份一個已經裝好的操作系統的 rootvg,然後將其恢復到其他的客戶機上,並且根據客戶機的定義,更新主機名、IP 等信息,而且可以使用備份包含的其他軟體程序。

在 NIM 中,所有的東西都是資源(resource):客戶機是資源,裡面包含了客戶機的主機名、IP 等信息;安裝介質是資源,包含了安裝介質的位置;bundle 是資源,決定了安裝軟體包的列表,腳本也是資源,決定了安裝工程中或者系統啟動過程中執行的腳本。NIM 就是由這許許多多的資源組合起來的安裝環境,用戶可以將指定的資源部署到指定的客戶機上。

nim -o <operation> [-F] [-t <type>] [ -S <YYMMDDhhmm> ] [-a <attr=value>]... <object name>

NIM 命令各選項含義如下:

列 名 含 義
-o <operation> 要進行的操作
[-t <type>] 資源的類型
[ -S <YYMMDDhhmm> ] 指明時間
[-a <attr=value>] 資源屬性
<object name> 對象名

NIM 命令使用示例:

 localhost# nim -o define -t lpp_source -a server=master -a \           location==/export/lpp_source/lpp_aix5.3 lpp_aix5.3   

Yum

Yum 是 RedHat/Fedora 推薦、SuSE 也支持的一種升級與更新軟體包的管理工具,在系統安裝時一般都默認安裝,包括文本命令行式與圖形化兩種操作模式。

它的主要功能包括:安裝軟體、更新、移除、搜索軟體包與更新系統。

使用 Yum 時,應指定一個操作,以及一個或多個軟體包 / 軟體組。你可以對不同的軟體來源進行選擇:軟體倉庫或者單獨的軟體包;當選擇從軟體倉庫進行安裝新軟體時,對於每個操作,Yum 都要從已配置的倉庫中下載最新的軟體包信息。如果網路連接比較慢,yum 會用數秒鐘來下載倉庫的索引以及軟體包的文件頭。

為得到所需的結果,Yum 工具搜索這些數據文件,產生最好的動作集合,然後顯示待處理的事務,您可以批準是否繼續。事務可能會包含安裝,更新或刪除額外的軟體,以此來滿足軟體依賴關係。

yum [options] [command] [package ...]

Yum 命令主要選項的含義如下:

列 名 含 義
Install 安裝新軟體
groupinstall 安裝新軟體組
update 更新軟體
groupupdate 更新軟體組
remove 系統採用的時區
list 搜索軟體,
Search 檢測所有可用的軟體的名稱、描述、概述和已列出的維護者,查找匹配的值
Provides 檢測軟體包中包含的文件以及軟體提供的功能
localinstall 從單獨的軟體包進行新軟體
Clean 清空 Yum 緩存

Yum 命令使用示例:

localhost# yum install scim   





自動化更新具體實現

在大規模、多節點的 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 對每個節點進行遠程自動化軟體升級與更新。

  1. 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

  2. updateAIXSW.pl 文件

    命令格式:updateAIXSW.pl – c SWConfName – n nodeName1, nodeName2, … .

    該可執行文件主要包含自動化升級與更新軟體包代碼:

     #!/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;   


[火星人 ] Unix/Linux 系統自動化管理: 系統更新篇已經有616次圍觀

http://coctec.com/docs/linux/show-post-68707.html