Ruby是功能丰富,免费,简单,可扩展,可移植且面向对象的脚本语言。 最近它在全球Web上获得了极大的普及。 这种流行至少可以部分归因于用Ruby编写的非常强大的Web应用程序开发框架Rails。 Rails或Ruby on Rails(ROR)被称为提供了一个非常强大的平台,可以非常快速有效地开发Web应用程序。 它具有高度的可扩展性,并且Web上有许多站点是使用Ruby on Rails构建的。
除了将Ruby与Rails一起用作Web应用程序开发平台外,Ruby还有另一面广为人知的方面,那就是Ruby作为一种强大的脚本语言,与Python或Perl处于同一联盟。 由于具有许多内置和外部库,因此它具有巨大的功能,可以利用它们的功能来解决可能在任何工作环境中出现的大量脚本需求。
系统管理就是这样一种工作环境,需要大量的脚本来简化和提高效率。 与单调的手动工作相比,脚本编写可以更好地处理用户管理,流程管理,文件管理,软件包管理和其他基本自动化要求。 在这种情况下,Ruby非常方便。 它具有一组用于实现此目的的库。
在本文中,我将从示例开始,向您展示如何使用Ruby来简化系统管理的一些基本脚本需求。 这些示例介绍了Ruby作为Shell脚本的强大替代品的功能。 这些示例肯定为很多改进提供了空间,并且可以根据需要进一步增强或定制。 在基本示例之后,我将介绍一个非常强大的Ruby系统管理库Cfruby。 该库包含了广泛的功能,可以简化系统管理。
对于本文,我假设读者具有Ruby的使用知识。 我在这里展示的基本示例使用纯Ruby,因此可以在Ruby支持的任何类似UNIX®的系统以及Windows®上使用。 对于更高级的Cfruby示例,您将需要访问UNIX系统。 下面的所有示例均已在Linux®机器上使用Ruby v1.8.4进行了尝试。 他们也应该使用最新版本的Ruby。
Ruby在行动
这里的第一个示例在指定的路径中搜索与给定模式匹配的文件,并以用户友好的方式给出这些文件的详细信息。 这不依赖于任何命令行实用程序,而仅使用Ruby的内置API来实现目标。 因此,它可以在运行Ruby的任何平台上运行。
此外,它显示了Ruby可以多么强大地大大简化此类脚本要求。 在这里,它不仅模拟* nix“ find”命令,而且还在其上构建,因此在使用Ruby时显示了定制能力。
清单1.在给定路径中搜索与给定模式匹配的文件,并显示其详细信息
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
在此示例中:
- 第5-11行-向用户查询搜索路径和搜索模式。
- 第16行-使用'Find'类中的Ruby'find'方法遍历指定的搜索路径。
- 第17行-检查找到的文件是否为目录。 如果是,并且不是“。”,则它将递归遍历到目录中。
- 第24行-使用'File'类的'fnmatch'方法检查找到的文件是否与给定的模式匹配。
- 第25-34行-如果文件与模式匹配,则打印文件的详细信息。
这是此脚本的示例输出。
清单2.第一个示例的示例输出
[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在这里派上用场。 在这里,第二个示例以第一个示例为基础,并结合了一个场景,在该场景中,您希望压缩搜索结果得到的文件列表。
内置的zlib模块有助于处理gzip文件,并且对于大多数情况已经足够了。 但是,在这里,我将使用另一个名为“ rubyzip”的良好Ruby库来创建和使用zip存档文件。 请参阅“ 相关主题”部分以获取下载该链接的链接。 另外,请注意,此示例使用纯Ruby,并且不依赖于计算机上存在的任何命令行实用程序。
安装rubyzip
- 从提供的链接下载“ rubyzip” gem,然后将其复制到您的系统中。 (撰写本文时为“ rubyzip-0.9.1.gem”。)
- 运行gem install 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 = 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文件。
本示例执行以下操作:
- 第9-15行-向用户查询搜索路径和搜索模式。
- 第23行-创建一个名为“ test.zip”的新ZipFile。
- 第25行-使用'Find'类中的Ruby'find'方法遍历指定的搜索路径。
- 第26行-检查找到的文件是否为目录。 如果是,并且不是“。”,则它将递归遍历到目录中。
- 第33行-使用'File'类的'fnmatch'方法检查找到的文件是否与给定的模式匹配。
- 第35行-将匹配的文件添加到zip存档中。
这是一个示例输出:
清单4.第二个示例的示例输出
[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基本上是一个由两部分组成的软件包:
- Cfrubylib –具有用于系统管理的类和方法的纯Ruby库。 这包括文件复制,查找,校验和,程序包管理,用户管理等。
- Cfenjin –一种简单的脚本语言,有助于对系统管理任务进行脚本编写(不了解Ruby)。
Cfruby可以作为Ruby gem或tar压缩文件下载。 宝石方式是最简单,最容易的。 获取gem并使用“ gem install”命令安装它。
安装Cfruby:
- 将下载的Cfruby gem文件复制到您的系统中。 (撰写本文时为'cfruby-1.01.gem'。)
- 运行gem install cfruby-1.01.gem。
现在应在系统上安装Cfruby。
使用Cfruby
现在,我将展示Cfruby的功能以及它如何极大地简化系统管理。
有两种访问Cfruby库提供的功能的基本方法:
- 直接使用libcfgruby中的Ruby类。
- 使用cfrubyscript包装器,该包装器为libcfruby提供更整洁的接口。
直接使用libcfruby中的Ruby类
Libcfruby是Cfruby的核心,Cfruby是一系列模块的集合,这些模块提供了使系统维护和设置更加容易的各种功能。 要使用libcfruby,您需要在安装Cfruby gem之后在脚本顶部添加'require_gem'cfruby'。 这将提供对libcfruby中所有可以在脚本中使用的任何核心模块的直接访问。此方法的唯一缺点是libcfruby很大,并且将所有类和方法堆叠到自己的命名空间中。 因此,要访问任何类,您都需要使用名称空间对它进行限定。 例如,libcfruby提供了一种获取系统类型的方法。 为此,您需要执行以下操作:
清单5.使用libcfruby获取操作系统类型
require 'rubygems'
require_gem 'cfruby'
os = Cfruby::OS::OSFactory.new.get_os()
puts(os.name)
这仅仅是为了获得操作系统的名称。 因此,当您使用libcfruby进行更多操作时,所有Namsepace规范都会使您的脚本变得更加混乱。 这是使用Cfruby的下一种方法很方便的地方。
使用cfrubyscript包装器,该包装器为libcfruby提供更整洁的界面
要使用cfrubyscript包装器,您需要添加:
清单6.使用cfrubyscript
require 'rubygems'
require_gem 'cfruby'
require 'libcfruby/cfrubyscript'
执行此操作会将cfrubyscript包含到脚本中,从而为访问libcfruby的功能提供了一个漂亮而简单的界面。
cfrubyscript实现的是:
- 它将一组变量导出到全局名称空间,例如$ os,$ pkg,$ user,$ proc和$ sched。
- 它将大多数主要模块拉入主命名空间,因此您可以调用FileEdit.set而不是Cfruby :: FileEdit.set。
- 它在String和Array中添加了许多执行Cfruby功能的辅助方法(安装程序,编辑文件等)。
- 它还为您提供了一个不错的记录器。
因此,脚本中不再出现名称空间规范混乱的情况。 上面获取系统操作系统类型的相同示例现在变为:
清单7.使用cfrubyscript获取操作系统的类型
require 'rubygems'
require_gem 'cfruby'
require 'libcfruby/cfrubyscript'
puts($os.name)
它仅使用全局变量$ os转换为一个调用。 Cfruby非常强大,并提供了多种功能来管理类似* nix的系统。
现在看看其中的一些以及使用它们的一些基本示例。
用户管理
在任何系统管理中,最常见和最重要的任务之一就是用户和组的管理。 Cfruby提供了一套功能强大的方法来以可移植和简单的方式实现它。
这是通过使用可以从OS模块获得的UserManager对象来实现的,如下所示。
清单8.使用libcfruby获取UserManager对象
require 'rubygems'
require_gem 'cfruby'
osfactory = Cfruby::OS::OSFactory.new()
os = osfactory.get_os()
usermgr = os.get_user_manager()
如果您使用cfrubyscript方法,将已经有一个全局用户管理器对象$ user,可以直接用于调用方法。 我将遵循此方法,因为它更简单易读。
这是使用它创建和删除用户的方法。
清单9.使用cfgrubyscript的用户管理
require 'rubygems'
require_gem 'cfruby'
require 'libcfruby/cfrubyscript'
$user.adduser('newusername','password')
$user.deleteuser('usernametodelete',true)
它有什么作用?
- 第1行,第2行–与往常一样,脚本中包含libcfruby和cfrubyscript。
- 第3行–这将创建一个新用户,其用户名为“ newusername”,密码指定为第二个参数。
- 第4行–这将删除用户名为“ usernametodelete”的用户。 第二个参数是true或false,用于指定是否删除要删除的用户的主目录。
同样,可以通过使用UserManager对象中的addgroup()和deletegroup()方法来进行组操作。
流程管理
管理员的另一重要任务是跟踪系统上正在运行的进程并进行管理。 Cfruby也在这里派上用场,提供有效处理流程的手段。
您可以使用Cfruby做到这一点。
清单10.使用cfgrubyscript进行流程管理
require 'rubygems'
require_gem 'cfruby'
require 'libcfruby/cfrubyscript'
$proc.kill($proc.vim)
'ps –aef'.exec()
它有什么作用?
- 第3行–使用全局ProcessManager对象$ proc终止指定为参数的'vim'进程。 $ proc.vim是系统上运行的'vim'进程的ProcessInfo类型的对象。 这些由cfrubyscript自动创建。
- 第4行–使用指定的命令“ ps –aef”启动新进程。 您可以从命令字符串直接调用exec方法。
包装管理
在系统上管理软件是系统管理员必须执行的另一项任务。 Cfruby提供了一些方法,可以轻松地从系统中安装和删除软件。
清单11.使用cfgrubyscript的软件包管理
require 'rubygems'
require_gem 'cfruby'
require 'libcfruby/cfrubyscript'
all = $pkg.packages()
installed = $pkg.installed_packages()
ruby.install()
它有什么作用?
- 第3行–使用cfrubyscript创建的全局$ pkg PackageManager对象,并通过调用packages()方法获取系统上所有可用的软件包。
- 第4行–这将获取所有已安装软件包的列表。
- 第5行–这通过调用install方法来安装Ruby软件包。 您可以从包名称本身直接调用install helper方法。
这是简化事物的级别。
文件管理
Cfruby还有助于管理系统上的文件。 使用Cfruby提供的方法可以轻松实现创建,编辑,删除,更改所有权和更改权限等操作
清单12.使用cfgrubyscript的文件管理
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”的所有者和组以及权限。 直接从文件本身调用chown_mod()方法。 cfrubyscript的辅助对象和方法再次使这成为可能。 注意如何只用一行就可以实现这一目标。
因此,以上示例应该使您了解Cfruby的功能强大,以及使用它轻松便捷地管理和管理系统有多么容易。 而且,它通过提供的一组直观的类和方法,使系统管理的整个任务变得更加轻松和有趣。
关于Cfruby及其完整的功能集,还有更多的知识。 它具有一组不错的文档。 我建议您看一下文档,以释放这个Ruby库的全部功能。 请在参考资料部分中找到链接。
摘要
Ruby不仅用于与Rails框架一起进行Web应用程序开发。 它也可以用作强大的脚本语言,并且可以很好地替代通常用于实现系统管理中脚本需求的常规shell脚本。
借助其内置的模块集和一些外部库,Ruby可以使系统管理更加高效,并且无疑更加有趣。 Ruby是一个非常有用且功能强大的工具,它是每个系统管理员工具箱中的必备工具。
翻译自: https://www.ibm.com/developerworks/aix/library/au-rubysysadmin/index.html