除了用作強大的 Web 應用程序開發平台外,通過與 Rails 框架相結合,Ruby 還具有較少被提及的另一面,那就是作為一種強大的腳本語言,就像 Python 或 Perl 那樣。它擁有非常強大的功能,由於可以使用很多內建的和外部的庫,因此可利用它的威力來解決通常系統管理工作環境中出現的很多腳本編寫需求。而且,用 Ruby 編程也很有趣!
簡介
Ruby 是一種功能極其豐富的、免費的、簡單的、可擴展的、可移植的、面向對象的腳本編程語言。最近,它在 Web 領域廣受歡迎。這在一定程度上要歸因於非常強大的 Web 應用程序開發框架 Rails,Rails 正是用 Ruby 編寫的。Rails,也稱 Ruby on Rails(ROR),顧名思義,它為快速、有效地開發 Web 應用程序提供一個非常強大的平台。它是高度可伸縮的,Web 上有很多站點就是用 Ruby on Rails 構建的。
除了與 Rails 一起用作 Web 應用程序開發平台外,Ruby 還具有較少被提及的另一面,那就是作為一種強大的腳本編程語言,就像 Python 或 Perl 那樣。它擁有非常強大的功能,由於可以使用很多內建的和外部的庫,因此可利用它的威力來解決通常系統管理工作環境中出現的很多腳本編程需求。
系統管理需要大量編寫腳本以使事情更簡單、更有效。編寫腳本比單調的手動工作能更好地解決用戶管理、進程管理、文件管理、軟體包管理和其他基本的自動化需求。在這個場景中,Ruby 非常有用。它有一套很好的庫可滿足這一點。
對於本文,我假設讀者具有 Ruby 的應用知識。這裡提供的基本例子使用純 Ruby,因此可以在 Ruby 支持的任何類 UNIX® 系統以及 Windows® 上運行。對於更高級的 Cfruby 例子,需要能夠使用一個 UNIX 系統。下面所有的例子已經在一台 Linux® 機器上使用 Ruby v1.8.4 進行了測試。它們應該也能用於最新版本的 Ruby。
實踐中的 Ruby
第一個例子在指定路徑中搜索符合給定模式的文件,並以用戶友好的方式給出關於這些文件的詳細信息。實現這一目標不必依賴於任何命令行實用程序,只需使用 Ruby 內建的 API。因此,這個例子在有 Ruby 運行的任何平台上都能運行。
而且,這個例子展示了 Ruby 在簡化腳本編寫需求方面有多強大。它不是簡單地模擬 *nix "find" 命令,而是構建在該命令之上,因而在使用 Ruby 時具有很強的定製能力。
require 'find' puts "" puts "-----------------------File Search-----------------------------------" puts "" print "Enter the search path : " searchpath = gets searchpath = searchpath.chomp puts "" print "Enter the search pattern : " pattern = gets pattern = pattern.chomp puts"----------------------------------------------------------------------" puts "Searching in " + searchpath + " for files matching pattern " + pattern puts"----------------------------------------------------------------------" 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 |
在這個例子中:
下面是這個腳本的一個示例輸出。
[root@logan]# ruby findexample.rb -----------------------File Search----------------------------------- Enter the search path : /test Enter the search pattern : *.rb ---------------------------------------------------------------------- Searching in /test for files matching pattern *.rb ---------------------------------------------------------------------- Filename : s.rb Permissions : 100644 Owning uid : 1 Owning gid : 1 Size (bytes) : 57 --------------------------------------------------- Filename : test.rb Permissions : 100644 Owning uid : 0 Owning gid : 0 Size (bytes) : 996 --------------------------------------------------- Filename : s1.rb Permissions : 100644 Owning uid : 1 Owning gid : 1 Size (bytes) : 39 --------------------------------------------------- |
在系統管理期間,最常見的一個需求是有效地使用 zip 文件來管理備份,或者將一組文件從一台計算機轉移到另一台計算機。在這個方面,Ruby 很有優勢。這裡的第二個例子構建在第一個例子的基礎上,但是包含了一個場景,在此場景中,需要將搜索到的文件打包到 zip 文件中。
內建的 zlib 模塊可幫助處理 gzip 文件,對於大多數情況它都夠好。但是,在這裡我將使用另一個很好的 Ruby 庫,即 “rubyzip”,來創建和處理 zip 歸檔文件。請查看 參考資料 小節,找到下載它的鏈接。而且要注意,這個例子使用純 Ruby,它不依賴於計算機上當前提供的任何命令行實用程序。
安裝 rubyzip
require 'rubygems' require_gem 'rubyzip' require 'find' require 'zip/zip' puts "" puts "------------------File Search and Zip-----------------------------" puts "" print "Enter the search path : " searchpath = gets searchpath = searchpath.chomp puts "" print "Enter the search pattern : " pattern = gets pattern = pattern.chomp puts"----------------------------------------------------------------------" puts "Searching in " + searchpath + " for files matching pattern " + pattern puts"----------------------------------------------------------------------" 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 } |
這個腳本為根據提供的搜索路徑和搜索模式搜索到的文件創建一個名為 “test.zip” 的 zip 文件。
這個例子做以下事情:
下面是一個示例輸出:
[root@logan]# ruby zipexample.rb -----------------------File Search----------------------------------- Enter the search path : /test Enter 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.zip Archive: 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 - 高級的系統管理
根據 Cfruby 站點的定義,“Cfruby 允許使用 Ruby 進行系統管理。它既是一個用於系統管理的 Ruby 函數庫,又是一個類 Cfengine 的克隆品(實際上是用於系統管理的一種特定領域語言,即 DSL)”。
Cfruby 基本上是一個由兩部分組成的包:
Cfruby 可以作為一個 Ruby gem 或 tar 壓縮文件下載。gem 是最簡單、最容易的方式。獲取 gem,並使用 “gem install” 命令安裝它。
安裝 Cfruby:
Cfruby 現在應該被安裝到系統上。
使用 Cfruby
現在,我將展示 Cfruby 的功能,以及它如何大大簡化系統管理。
有兩種基本的方式可訪問 Cfruby 庫提供的功能:
直接使用 libcfruby 中的 Ruby 類
Libcfruby 是 Cfruby 的核心,它包含一組模塊,這些模塊提供了各種用於簡化系統維護和設置的功能。為了使用 libcfruby,需要在安裝 Cfruby gem 之後,將 “require_gem 'cfruby'” 添加到腳本的頂端。這樣便可以直接訪問 libcfruby 中的所有核心模塊,在腳本中可以根據需要按任意方式使用它們。這種方法惟一的缺點是 libcfruby 比較大,它將所有的類和方法都放入到它們各自的名稱空間中。所以,為了訪問任何一個類,都需要以名稱空間加以限定。例如,libcfruby 提供了一個用於獲得系統類型的方法。要獲取操作系統的類型,需要做以下事情:
require 'rubygems' require_gem 'cfruby' os = Cfruby::OS::OSFactory.new.get_os() puts(os.name) |
這只是獲得操作系統的名稱。隨著您用 libcfruby 做更多的事情,您的腳本中將充斥著更多指定名稱空間的語句。正是由於這一點,另一種使用 Cfruby 的方法就顯得很方便。
使用 cfrubyscript 包裝器,這個包裝器為 libcfruby 提供了一個更簡潔的介面
為了使用 cfrubyscript 包裝器,需要添加:
require 'rubygems' require_gem 'cfruby' require 'libcfruby/cfrubyscript' |
這樣會將 cfrubyscript 包括到腳本中,然後就可以通過一個更簡單的介面來訪問 libcfruby 的功能。
cfrubyscript 做到了以下幾點:
所以,不再需要在腳本中指定一大堆的名稱空間。上面用於獲取操作系統類型的例子現在變成這樣:
require 'rubygems' require_gem 'cfruby' require 'libcfruby/cfrubyscript' puts($os.name) |
這可以翻譯成一個單獨的調用,該調用使用全局變數 $os。Cfruby 的確強大,它為管理類 *nix 系統提供了很多功能。
現在來看看其中一些功能,以及使用它們的一些基本例子。
用戶管理
在系統管理中,最常見、最重要的任務之一就是用戶和組的管理。Cfruby 以一種可移植的、簡單的方式提供了一套強大的方法來實現該任務。
該任務是使用 UserManager 對象實現的,這個對象可以像下面這樣從 OS 模塊獲得。
require 'rubygems' require_gem 'cfruby' osfactory = Cfruby::OS::OSFactory.new() os = osfactory.get_os() usermgr = os.get_user_manager() |
如果使用 cfrubyscript 方式,那麼已經有一個全局用戶管理對象,即 $user,它可以直接用於調用方法。我將使用這種方法,因為這樣更簡單,更易於閱讀。
下面展示如何使用它來創建和刪除一個用戶。
require 'rubygems' require_gem 'cfruby' require 'libcfruby/cfrubyscript' $user.adduser('newusername','password') $user.deleteuser('usernametodelete',true) |
上述代碼做什麼事情?
類似地,組操作也可以使用 UserManager 對象中的 addgroup() 和 deletegroup() 方法來完成。
進程管理
管理員的另一項重要的任務是跟蹤系統上運行的進程,並管理它們。Cfruby 在這方面也很有用,它為有效地處理進程提供了方法。
您可以使用 Cfruby 實現它。
require 'rubygems' require_gem 'cfruby' require 'libcfruby/cfrubyscript' $proc.kill($proc.vim) 'ps –aef'.exec() |
上述代碼做什麼事情?
包管理
系統管理員必須負責的另一項任務是管理系統上的包。Cfruby 提供了一些方法用於方便地在系統上安裝和刪除軟體。
require 'rubygems' require_gem 'cfruby' require 'libcfruby/cfrubyscript' all = $pkg.packages() installed = $pkg.installed_packages() ruby.install() |
上述代碼做什麼事情?
事情就是這麼簡單。
文件管理
Cfruby 還可以幫助管理系統上的文件。通過使用 Cfruby 提供的方法,可以輕鬆地創建、編輯、刪除、更改所有權和更改許可等等。
require 'rubygems' require_gem 'cfruby' require 'libcfruby/cfrubyscript' '/etc/ssh'.chown_mod('root', 'wheel', 'u=rw,g=r,o-rwx', `:recursive` => true) |
上述代碼做什麼事情?
所以,上述例子應該已經讓您了解到 Cfruby 有多強大,使用它來管理系統有多容易。而且,由於提供了一套非常直觀的類和方法,它使得系統管理的整個任務變得更加容易,也更加有趣。
關於 Cfruby 和它的那一整套功能還有很多需要知道的。它附帶有一套很好的文檔。建議您看一看這些文檔,這樣才能將這個 Ruby 庫的全部威力釋放出來。請查看參考資料小節,獲取相關鏈接。
結束語
Ruby 不僅可以與 Rails 框架一起用於 Web 應用程序開發。它還可以像腳本編程語言一樣強大,作為通常的 shell 腳本編程的一個很好的替代品,常用於實現系統管理中的腳本編程需求。
通過使用 Ruby 的一套內建模塊和一些外部的庫,系統管理員可以變得更加高效,工作更加有趣。Ruby 是一個非常有用、非常強大的工具,是每個系統管理員工具箱中必備的工具。(責任編輯:A6)
[火星人 ] 系統管理員的 Ruby已經有621次圍觀