Ruby具有非常強(qiáng)大的功能,因?yàn)樗梢允褂迷S多內(nèi)置和外部庫(kù),因此它可以利用自己的能力在正常的系統(tǒng)管理工作環(huán)境中解決許多腳本需求,其實(shí)使用Ruby編程的很有趣的,武林技術(shù)頻道為大家詳細(xì)介紹使用Ruby編寫腳本進(jìn)行系統(tǒng)管理的教程。
簡(jiǎn)介
Ruby 是一種功能極其豐富的、免費(fèi)的、簡(jiǎn)單的、可擴(kuò)展的、可移植的、面向?qū)ο蟮哪_本編程語(yǔ)言。最近,它在 Web 領(lǐng)域廣受歡迎。這在一定程度上要?dú)w因于非常強(qiáng)大的 Web 應(yīng)用程序開(kāi)發(fā)框架 Rails,Rails 正是用 Ruby 編寫的。Rails,也稱 Ruby on Rails(ROR),顧名思義,它為快速、有效地開(kāi)發(fā) Web 應(yīng)用程序提供一個(gè)非常強(qiáng)大的平臺(tái)。它是高度可伸縮的,Web 上有很多站點(diǎn)就是用 Ruby on Rails 構(gòu)建的。
除了與 Rails 一起用作 Web 應(yīng)用程序開(kāi)發(fā)平臺(tái)外,Ruby 還具有較少被提及的另一面,那就是作為一種強(qiáng)大的腳本編程語(yǔ)言,就像 Python 或 Perl 那樣。它擁有非常強(qiáng)大的功能,由于可以使用很多內(nèi)建的和外部的庫(kù),因此可利用它的威力來(lái)解決通常系統(tǒng)管理工作環(huán)境中出現(xiàn)的很多腳本編程需求。
系統(tǒng)管理需要大量編寫腳本以使事情更簡(jiǎn)單、更有效。編寫腳本比單調(diào)的手動(dòng)工作能更好地解決用戶管理、進(jìn)程管理、文件管理、軟件包管理和其他基本的自動(dòng)化需求。在這個(gè)場(chǎng)景中,Ruby 非常有用。它有一套很好的庫(kù)可滿足這一點(diǎn)。
對(duì)于本文,我假設(shè)讀者具有 Ruby 的應(yīng)用知識(shí)。這里提供的基本例子使用純 Ruby,因此可以在 Ruby 支持的任何類 UNIX? 系統(tǒng)以及 Windows? 上運(yùn)行。對(duì)于更高級(jí)的 Cfruby 例子,需要能夠使用一個(gè) UNIX 系統(tǒng)。下面所有的例子已經(jīng)在一臺(tái) Linux? 機(jī)器上使用 Ruby v1.8.4 進(jìn)行了測(cè)試。它們應(yīng)該也能用于最新版本的 Ruby。
實(shí)踐中的 Ruby
第一個(gè)例子在指定路徑中搜索符合給定模式的文件,并以用戶友好的方式給出關(guān)于這些文件的詳細(xì)信息。實(shí)現(xiàn)這一目標(biāo)不必依賴于任何命令行實(shí)用程序,只需使用 Ruby 內(nèi)建的 API。因此,這個(gè)例子在有 Ruby 運(yùn)行的任何平臺(tái)上都能運(yùn)行。
而且,這個(gè)例子展示了 Ruby 在簡(jiǎn)化腳本編寫需求方面有多強(qiáng)大。它不是簡(jiǎn)單地模擬 *nix "find" 命令,而是構(gòu)建在該命令之上,因而在使用 Ruby 時(shí)具有很強(qiáng)的定制能力。
清單 1. 在給定路徑中搜索符合給定模式的模式的文件,并顯示它們的詳細(xì)信息
require 'find'puts ""puts "-----------------------File Search-----------------------------------"puts ""print "Enter the search path : "searchpath = getssearchpath = searchpath.chompputs ""print "Enter the search pattern : "pattern = getspattern = pattern.chompputs"----------------------------------------------------------------------"puts "Searching in " + searchpath + " for files matching pattern " + patternputs"----------------------------------------------------------------------"puts "" Find.find(searchpath) do |path| if FileTest.directory?(path) if File.basename(path)[0] == ?. Find.prune # Don't look any further into this directory. else next end else if File.fnmatch(pattern,File.basename(path)) puts "Filename : " + File.basename(path) s = sprintf("%o",File.stat(path).mode) print "Permissions : " puts s print "Owning uid : " puts File.stat(path).uid print "Owning gid : " puts File.stat(path).uid print "Size (bytes) : " puts File.stat(path).size puts "---------------------------------------------------" end end end
在這個(gè)例子中:
下面是這個(gè)腳本的一個(gè)示例輸出。
清單 2. 第一個(gè)例子的示例輸出
[root@logan]# ruby findexample.rb-----------------------File Search-----------------------------------Enter the search path : /testEnter the search pattern : *.rb----------------------------------------------------------------------Searching in /test for files matching pattern *.rb----------------------------------------------------------------------Filename : s.rbPermissions : 100644Owning uid : 1Owning gid : 1Size (bytes) : 57---------------------------------------------------Filename : test.rbPermissions : 100644Owning uid : 0Owning gid : 0Size (bytes) : 996---------------------------------------------------Filename : s1.rbPermissions : 100644Owning uid : 1Owning gid : 1Size (bytes) : 39---------------------------------------------------
在系統(tǒng)管理期間,最常見(jiàn)的一個(gè)需求是有效地使用 zip 文件來(lái)管理備份,或者將一組文件從一臺(tái)計(jì)算機(jī)轉(zhuǎn)移到另一臺(tái)計(jì)算機(jī)。在這個(gè)方面,Ruby 很有優(yōu)勢(shì)。這里的第二個(gè)例子構(gòu)建在第一個(gè)例子的基礎(chǔ)上,但是包含了一個(gè)場(chǎng)景,在此場(chǎng)景中,需要將搜索到的文件打包到 zip 文件中。
內(nèi)建的 zlib 模塊可幫助處理 gzip 文件,對(duì)于大多數(shù)情況它都?jí)蚝谩5牵谶@里我將使用另一個(gè)很好的 Ruby 庫(kù),即 “rubyzip”,來(lái)創(chuàng)建和處理 zip 歸檔文件。請(qǐng)查看 參考資料 小節(jié),找到下載它的鏈接。而且要注意,這個(gè)例子使用純 Ruby,它不依賴于計(jì)算機(jī)上當(dāng)前提供的任何命令行實(shí)用程序。
安裝 rubyzip
??? 通過(guò)提供的鏈接下載 “rubyzip” gem,并將它復(fù)制到系統(tǒng)中。(在撰寫本文之際,它的文件名是 “rubyzip-0.9.1.gem”)。
??? 運(yùn)行 gem 安裝 rubyzip-0.9.1.gem
清單 3. 使用 zip 文件
require 'rubygems'require_gem 'rubyzip'require 'find'require 'zip/zip'puts ""puts "------------------File Search and Zip-----------------------------"puts ""print "Enter the search path : "searchpath = getssearchpath = searchpath.chompputs ""print "Enter the search pattern : "pattern = getspattern = pattern.chompputs"----------------------------------------------------------------------"puts "Searching in " + searchpath + " for files matching pattern " + patternputs"----------------------------------------------------------------------"puts ""puts"----------------------------------------------------------------------"puts "Zipping up the found files..."puts"----------------------------------------------------------------------" Zip::ZipFile.open("test.zip", Zip::ZipFile::CREATE) { |zipfile| Find.find(searchpath) do |path| if FileTest.directory?(path) if File.basename(path)[0] == ?. Find.prune # Don't look any further into this directory. else next end else if File.fnmatch(pattern,File.basename(path)) p File.basename(path) zipfile.add(File.basename(path),path) end end end }
這個(gè)腳本為根據(jù)提供的搜索路徑和搜索模式搜索到的文件創(chuàng)建一個(gè)名為 “test.zip” 的 zip 文件。
這個(gè)例子做以下事情:
下面是一個(gè)示例輸出:
清單 4. 第二個(gè)例子的示例輸出
[root@logan]# ruby zipexample.rb-----------------------File Search-----------------------------------Enter the search path : /testEnter the search pattern : *.rb----------------------------------------------------------------------Searching in /test for files matching pattern *.rb--------------------------------------------------------------------------------------------------------------------------------------------Zipping up the found files...----------------------------------------------------------------------"s.rb""test.rb""s1.rb"[root@logan]# unzip -l test.zipArchive: test.zip Length Date Time Name -------- ---- ---- ---- 996 09-25-08 21:01 test.rb 57 09-25-08 21:01 s.rb 39 09-25-08 21:01 s1.rb -------- ------- 1092 3 files
Cfruby - 高級(jí)的系統(tǒng)管理
根據(jù) Cfruby 站點(diǎn)的定義,“Cfruby 允許使用 Ruby 進(jìn)行系統(tǒng)管理。它既是一個(gè)用于系統(tǒng)管理的 Ruby 函數(shù)庫(kù),又是一個(gè)類 Cfengine 的克隆品(實(shí)際上是用于系統(tǒng)管理的一種特定領(lǐng)域語(yǔ)言,即 DSL)”。
Cfruby 基本上是一個(gè)由兩部分組成的包:
Cfruby 可以作為一個(gè) Ruby gem 或 tar 壓縮文件下載。gem 是最簡(jiǎn)單、最容易的方式。獲取 gem,并使用 “gem install” 命令安裝它。
安裝 Cfruby:
Cfruby 現(xiàn)在應(yīng)該被安裝到系統(tǒng)上。
使用 Cfruby
現(xiàn)在,我將展示 Cfruby 的功能,以及它如何大大簡(jiǎn)化系統(tǒng)管理。
有兩種基本的方式可訪問(wèn) Cfruby 庫(kù)提供的功能:
直接使用 libcfruby 中的 Ruby 類
Libcfruby 是 Cfruby 的核心,它包含一組模塊,這些模塊提供了各種用于簡(jiǎn)化系統(tǒng)維護(hù)和設(shè)置的功能。為了使用 libcfruby,需要在安裝 Cfruby gem 之后,將 “require_gem 'cfruby'” 添加到腳本的頂端。這樣便可以直接訪問(wèn) libcfruby 中的所有核心模塊,在腳本中可以根據(jù)需要按任意方式使用它們。這種方法惟一的缺點(diǎn)是 libcfruby 比較大,它將所有的類和方法都放入到它們各自的名稱空間中。所以,為了訪問(wèn)任何一個(gè)類,都需要以名稱空間加以限定。例如,libcfruby 提供了一個(gè)用于獲得系統(tǒng)類型的方法。要獲取操作系統(tǒng)的類型,需要做以下事情:
清單 5. 使用 libcfruby 獲取操作系統(tǒng)類型
require 'rubygems'require_gem 'cfruby'os = Cfruby::OS::OSFactory.new.get_os()puts(os.name)
這只是獲得操作系統(tǒng)的名稱。隨著您用 libcfruby 做更多的事情,您的腳本中將充斥著更多指定名稱空間的語(yǔ)句。正是由于這一點(diǎn),另一種使用 Cfruby 的方法就顯得很方便。
使用 cfrubyscript 包裝器,這個(gè)包裝器為 libcfruby 提供了一個(gè)更簡(jiǎn)潔的接口
為了使用 cfrubyscript 包裝器,需要添加:
清單 6. 使用 cfrubyscript
require 'rubygems'require_gem 'cfruby'require 'libcfruby/cfrubyscript'
這樣會(huì)將 cfrubyscript 包括到腳本中,然后就可以通過(guò)一個(gè)更簡(jiǎn)單的接口來(lái)訪問(wèn) libcfruby 的功能。
cfrubyscript 做到了以下幾點(diǎn):
所以,不再需要在腳本中指定一大堆的名稱空間。上面用于獲取操作系統(tǒng)類型的例子現(xiàn)在變成這樣:
清單 7. 使用 cfrubyscript 獲取操作系統(tǒng)的類型
require 'rubygems'require_gem 'cfruby'require 'libcfruby/cfrubyscript'puts($os.name)
這可以翻譯成一個(gè)單獨(dú)的調(diào)用,該調(diào)用使用全局變量 $os。Cfruby 的確強(qiáng)大,它為管理類 *nix 系統(tǒng)提供了很多功能。
現(xiàn)在來(lái)看看其中一些功能,以及使用它們的一些基本例子。
用戶管理
在系統(tǒng)管理中,最常見(jiàn)、最重要的任務(wù)之一就是用戶和組的管理。Cfruby 以一種可移植的、簡(jiǎn)單的方式提供了一套強(qiáng)大的方法來(lái)實(shí)現(xiàn)該任務(wù)。
該任務(wù)是使用 UserManager 對(duì)象實(shí)現(xiàn)的,這個(gè)對(duì)象可以像下面這樣從 OS 模塊獲得。
清單 8. 使用 libcfruby 獲得 UserManager 對(duì)象
require 'rubygems'require_gem 'cfruby'osfactory = Cfruby::OS::OSFactory.new()os = osfactory.get_os()usermgr = os.get_user_manager()
如果使用 cfrubyscript 方式,那么已經(jīng)有一個(gè)全局用戶管理對(duì)象,即 $user,它可以直接用于調(diào)用方法。我將使用這種方法,因?yàn)檫@樣更簡(jiǎn)單,更易于閱讀。
下面展示如何使用它來(lái)創(chuàng)建和刪除一個(gè)用戶。
清單 9. 使用 cfgrubyscript 進(jìn)行用戶管理
require 'rubygems'require_gem 'cfruby'require 'libcfruby/cfrubyscript'$user.adduser('newusername','password')$user.deleteuser('usernametodelete',true)
上述代碼做什么事情?
類似地,組操作也可以使用 UserManager 對(duì)象中的 addgroup() 和 deletegroup() 方法來(lái)完成。
進(jìn)程管理
管理員的另一項(xiàng)重要的任務(wù)是跟蹤系統(tǒng)上運(yùn)行的進(jìn)程,并管理它們。Cfruby 在這方面也很有用,它為有效地處理進(jìn)程提供了方法。
您可以使用 Cfruby 實(shí)現(xiàn)它。
清單 10. 使用 cfgrubyscript 進(jìn)行進(jìn)程管理
require 'rubygems'require_gem 'cfruby'require 'libcfruby/cfrubyscript'$proc.kill($proc.vim)'ps –aef'.exec()
上述代碼做什么事情?
包管理
系統(tǒng)管理員必須負(fù)責(zé)的另一項(xiàng)任務(wù)是管理系統(tǒng)上的包。Cfruby 提供了一些方法用于方便地在系統(tǒng)上安裝和刪除軟件。
清單 11. 使用 cfgrubyscript 進(jìn)行包管理
require 'rubygems'require_gem 'cfruby'require 'libcfruby/cfrubyscript'all = $pkg.packages()installed = $pkg.installed_packages()ruby.install()
上述代碼做什么事情?
事情就是這么簡(jiǎn)單。
文件管理
Cfruby 還可以幫助管理系統(tǒng)上的文件。通過(guò)使用 Cfruby 提供的方法,可以輕松地創(chuàng)建、編輯、刪除、更改所有權(quán)和更改許可等等。
清單 12. 使用 cfgrubyscript 進(jìn)行文件管理
require 'rubygems'require_gem 'cfruby'require 'libcfruby/cfrubyscript''/etc/ssh'.chown_mod('root', 'wheel', 'u=rw,g=r,o-rwx', `:recursive` => true)
上述代碼做什么事情?
??? 第 3 行 – 更改文件 “/etc/ssh” 的所有者和組以及許可。直接從文件本身調(diào)用 chown_mod() 方法。這樣,這是通過(guò) cfrubyscript 的助手對(duì)象和方法實(shí)現(xiàn)的。注意,這里只用一行就實(shí)現(xiàn)了該功能。
所以,上述例子應(yīng)該已經(jīng)讓您了解到 Cfruby 有多強(qiáng)大,使用它來(lái)管理系統(tǒng)有多容易。而且,由于提供了一套非常直觀的類和方法,它使得系統(tǒng)管理的整個(gè)任務(wù)變得更加容易,也更加有趣。
關(guān)于 Cfruby 和它的那一整套功能還有很多需要知道的。它附帶有一套很好的文檔。建議您看一看這些文檔,這樣才能將這個(gè) Ruby 庫(kù)的全部威力釋放出來(lái)。請(qǐng)查看參考資料小節(jié),獲取相關(guān)鏈接。
結(jié)語(yǔ):Ruby不僅可以與用于Web應(yīng)用程序開(kāi)發(fā)的Rails框架一起使用。它也可以像腳本編程語(yǔ)言一樣強(qiáng)大。作為shell腳本的一個(gè)很好的替代品,它經(jīng)常被用來(lái)實(shí)現(xiàn)系統(tǒng)管理中的腳本需求。
|
新聞熱點(diǎn)
疑難解答
圖片精選