澳门皇冠金沙网站-澳门皇冠844网站

热门关键词: 澳门皇冠金沙网站,澳门皇冠844网站

一个提供资源和服务统一管理,使用Ruby编写脚本

澳门皇冠844网站 1

简介

使用Ruby编写脚本进行系统管理的教程,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 时具有很强的定制能力。
清单 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 行 - 使用 Ruby 中 “Find” 类中的 “find” 方法遍历指定的搜索路径。
  •     第 17 行 - 检查发现的文件是否为一个目录。如果是目录,并且不是 “.”,则递归地遍历该目录。
  •     第 24 行 - 使用 “File” 类中的 “fnmatch” 方法检查发现的文件是否符合给定的模式。
  •     第 25-34 行 - 如果文件符合模式,则打印文件的详细信息。

下面是这个脚本的一个示例输出。
清单 2. 第一个例子的示例输出

[[email protected]]# 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

    通过提供的链接下载 “rubyzip” gem,并将它复制到系统中。(在撰写本文之际,它的文件名是 “rubyzip-0.9.1.gem”)。
    运行 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 = 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 行 - 使用 Ruby 中 “Find” 类中的 “find” 方法遍历指定的搜索路径。
  •     第 26 行 - 检查发现的文件是否为一个目录。如果是目录,并且不是 “.”,则递归地遍历该目录。
  •     第 33 行 - 使用 “File” 类中的 “fnmatch” 方法检查发现的文件是否符合给定的模式。
  •     第 35 行 - 将符合的文件添加到 zip 归档中。

下面是一个示例输出:
清单 4. 第二个例子的示例输出

[[email protected]]# 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"

[[email protected]]# 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 基本上是一个由两部分组成的包:

  1.     Cfrubylib – 一个纯 Ruby 库,其中包含用于系统管理的类和方法。这包括文件复制、查找、校验和检查、包管理、用户管理等。
  2.     Cfenjin – 一种简单的脚本编程语言,可帮助为系统管理任务编写脚本(不必知道 Ruby)。

Cfruby 可以作为一个 Ruby gem 或 tar 压缩文件下载。gem 是最简单、最容易的方式。获取 gem,并使用 “gem install” 命令安装它。

安装 Cfruby:

  •     将下载的 Cfruby gem 文件复制到系统中。(在撰写本文之际,它的文件名是 “cfruby-1.01.gem”)。
  •     运行 gem 安装 cfruby-1.01.gem。

Cfruby 现在应该被安装到系统上。
使用 Cfruby

现在,我将展示 Cfruby 的功能,以及它如何大大简化系统管理。

有两种基本的方式可访问 Cfruby 库提供的功能:

  1.     直接使用 libcfgruby 中的 Ruby 类。
  2.     使用 cfrubyscript 包装器,它为 libcfruby 提供了一个更简洁的接口。

直接使用 libcfruby 中的 Ruby 类

Libcfruby 是 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 做更多的事情,您的脚本中将充斥着更多指定名称空间的语句。正是由于这一点,另一种使用 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 以一种可移植的、简单的方式提供了一套强大的方法来实现该任务。

该任务是使用 UserManager 对象实现的,这个对象可以像下面这样从 OS 模块获得。
清单 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 助手方法。

事情就是这么简单。
文件管理

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 是一个非常有用、非常强大的工具,是每个系统管理员工具箱中必备的工具。

简介 Ruby 是一种功能极其丰富的、免费的、简单的、可扩展的、可移植的、面向对象的...

Libral 为系统资源和服务提供了一个统一的管理 API ,其可以作为脚本管理任务和构建配置管理系统的坚实基础。

Ruby 是一种功能极其丰富的、免费的、简单的、可扩展的、可移植的、面向对象的脚本编程语言。最近,它在 Web 领域广受欢迎。这在一定程度上要归因于非常强大的 Web 应用程序开发框架 Rails,Rails 正是用 Ruby 编写的。Rails,也称 Ruby on Rails(ROR),顾名思义,它为快速、有效地开发 Web 应用程序提供一个非常强大的平台。它是高度可伸缩的,Web 上有很多站点就是用 Ruby on Rails 构建的。

作为继承了 Unix 的传统的 Linux 操作系统,其并没有一个综合的系统管理 API 接口,相反,管理操作是通过多种特定用途的工具和 API 来实现的,其每一个都有自己约定和特有的风格。这就使得编写一个哪怕是简单的系统管理任务的脚本也很困难、很脆弱。

除了与 Rails 一起用作 Web 应用程序开发平台外,Ruby 还具有较少被提及的另一面,那就是作为一种强大的脚本编程语言,就像 Python 或 Perl 那样。它拥有非常强大的功能,由于可以使用很多内建的和外部的库,因此可利用它的威力来解决通常系统管理工作环境中出现的很多脚本编程需求。

举个例子来说,改变 “app” 用户的登录 shell 要运行 usermod -s /sbin/nologin app。这个命令通常没有问题,只是当系统上没有 “app” 用户时就不行了。为了解决这个例外错误,具有创新精神的脚本编写者也许要这样写:

系统管理需要大量编写脚本以使事情更简单、更有效。编写脚本比单调的手动工作能更好地解决用户管理、进程管理、文件管理、软件包管理和其他基本的自动化需求。在这个场景中,Ruby 非常有用。它有一套很好的库可满足这一点。

  1. grep-q app /etc/passwd
  2. &&usermod-s /sbin/nologin app
  3. ||useradd...-s /sbin/nologin app

对于本文,我假设读者具有 Ruby 的应用知识。这里提供的基本例子使用纯 Ruby,因此可以在 Ruby 支持的任何类 UNIX? 系统以及 Windows? 上运行。对于更高级的 Cfruby 例子,需要能够使用一个 UNIX 系统。下面所有的例子已经在一台 Linux? 机器上使用 Ruby v1.8.4 进行了测试。它们应该也能用于最新版本的 Ruby。

这样,当 “app” 用户存在于系统中时,会执行更改登录 shell 的操作;而当此用户不存在时,就会创建此用户。不幸的是,这种编写系统管理任务脚本的方式是不适合的:对于每一种资源来说都会有一套不同的工具,而且每个都有其不同的使用惯例;不一致性和经常出现的不完备的错误报告将会使错误的处理变得困难;再者也会因为工具自身的特性引发的故障而导致执行失败。

实践中的 Ruby

实际上,以上所举的例子也是不正确的:grep 并不是用来查找 “app” 用户的,它只能在文件 /etc/passwd 的一些行中简单的查找是否有字符串 “app”,在大多数情况下它或许可以工作,但是也可能会在最关键的时刻出错。

第一个例子在指定路径中搜索符合给定模式的文件,并以用户友好的方式给出关于这些文件的详细信息。实现这一目标不必依赖于任何命令行实用程序,只需使用 Ruby 内建的 API。因此,这个例子在有 Ruby 运行的任何平台上都能运行。

很显然,那些执行简单任务的脚本管理工具,很难成为大型管理系统的基础。认识到这一点,现有的配置管理系统,比如 Puppet、Chef 及 Ansible,围绕基本的操作系统资源的管理竭尽全力的建立其内部 API 就是明智之举。这些资源抽象是内部 API,其与所需的相应工具密切相关。但这不仅导致大量的重复性工作,也为尝试一个新创新的管理工具设置了强大的障碍。

而且,这个例子展示了 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

Libral 将为管理工具和任务提供一个可靠的保证,通过对系统资源提供一个公用的管理 API,并使其可以通过命令行工具 ralsh 使用,它允许用户按照相同的方法查询和修改系统资源,并有可预见的错误报告。对以上的举例来说,可以通过命令 ralsh -aq user app 检查 “app” 用户是否存在;通过 ralsh -aq package foo 检查 “foo” 软件包是否已经安装;一般情况下,可以通过命令 ralsh -aq TYPE NAME 检查 ”NAME“ 是否是 ”TYPE“ 类型的资源。类似的,要创建或更改已存在的用户,可以运行:

在这个例子中:

  1. ralsh user app home=/srv/app shell=/sbin/nologin
  •     第 5-11 行 - 请求用户提供搜索路径和搜索模式。
  •     第 16 行 - 使用 Ruby 中 “Find” 类中的 “find” 方法遍历指定的搜索路径。
  •     第 17 行 - 检查发现的文件是否为一个目录。如果是目录,并且不是 “.”,则递归地遍历该目录。
  •     第 24 行 - 使用 “File” 类中的 “fnmatch” 方法检查发现的文件是否符合给定的模式。
  •     第 25-34 行 - 如果文件符合模式,则打印文件的详细信息。

以及,要在文件 /etc/hosts 创建和修改条目,可以运行命令:

下面是这个脚本的一个示例输出。
清单 2. 第一个例子的示例输出

  1. ralsh hostmyhost.example.com ip=10.0.0.1
  2. host_aliases=myhost,apphost
[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
---------------------------------------------------

以这种方式运行,“ralsh” 的使用者事实上完全隔离在那两个命令内部的不同运行工作机制之外:第一个命令需要适当的调用命令 useradd 或者 usermod,而第二个需要在 /etc/hosts 文件中进行编辑。而对于该用户来说,他们似乎都采取同样的模型:“确保资源处于我所需要的状态。”

在系统管理期间,最常见的一个需求是有效地使用 zip 文件来管理备份,或者将一组文件从一台计算机转移到另一台计算机。在这个方面,Ruby 很有优势。这里的第二个例子构建在第一个例子的基础上,但是包含了一个场景,在此场景中,需要将搜索到的文件打包到 zip 文件中。

 

内建的 zlib 模块可帮助处理 gzip 文件,对于大多数情况它都够好。但是,在这里我将使用另一个很好的 Ruby 库,即 “rubyzip”,来创建和处理 zip 归档文件。请查看 参考资料 小节,找到下载它的链接。而且要注意,这个例子使用纯 Ruby,它不依赖于计算机上当前提供的任何命令行实用程序。

怎样获取和使用 Libral 呢?

Libral 可以在这个 git 仓库找到并下载。其核心是由 C 编写的,构建它的说明可以在该仓库中找到,不过只是在你想要为 Libral 的 C 核心做贡献的时候才需要看它。Libral 的网站上包含了一个 预构建的 tarball,可以用在任何使用 “glibc 2.12” 或者更高版本的 Linux 机器上。可以使用该 “tarball” 的内容进一步探究 ralsh ,以及开发新的提供者(provider),它使得 Libral 具备了管理新类型资源的能力。

在下载解压 tarball 后,在目录 ral/bin 下能找到 ralsh 命令。运行不需要任何参数的 ralsh 命令就会列举出来 Libral 的所有资源类型。利用 --help 选项可以打印输出关于 ralsh 的更多说明。

 

安装 rubyzip

与配置管理系统的关系

知名的配置管理系统,如 Puppet、Chef 及 Ansible,解决了一些 Libral 所解决的同样的问题。将 Libral 与它们的区分开的主要是它们所做工作和 Libral 不同。配置管理系统被构建来处理跨大量节点管理各种事物的多样性和复杂性。而另一方面 Libral 旨在提供一个定义明确的低级别的系统管理 API ,独立于任何特定的工具,可用于各种各样的编程语言。

通过消除大型配置管理系统中包含的应用程序逻辑,Libral 从前面介绍里提及的简单的脚本任务,到作为构建复杂的管理应用的构建块,它在如何使用方面是非常灵活的。专注与这些基础层面也使其保持很小,目前不到 2.5 MB,这对于资源严重受限的环境,如容器和小型设备来说是一个重要考虑因素。

 

    通过提供的链接下载 “rubyzip” gem,并将它复制到系统中。(在撰写本文之际,它的文件名是 “rubyzip-0.9.1.gem”)。
    运行 gem 安装 rubyzip-0.9.1.gem

Libral API

在过去的十年里,Libral API 是在实现配置管理系统的经验下指导设计的,虽然它并没有直接绑定到它们其中任何一个应用上,但它考虑到了这些问题,并规避了它们的缺点。

在 API 设计中四个重要的原则:

  • 期望的状态
  • 双向性
  • 轻量级抽象
  • 易于扩展

基于期望状态的管理 API,举个例子来说,用户表示当操作执行后希望系统看起来是什么状态,而不是怎样进入这个状态,这一点什么争议。双向性使得使用(读、写)相同的 API 成为可能,更重要的是,相同的资源可以抽象成读取现有状态和强制修改成这种状态。轻量级抽象行为确保能容易的学习 API 并能快速的使用;过去在管理 API 上的尝试过度加重了学习建模框架的使用者的负担,其中一个重要的因素是他们的接受力缺乏。

最后,它必须易于扩展 Libral 的管理功能,这样用户可以教给 Libral 如何管理新类型的资源。这很重要,因为人们也许要管理的资源可能很多(而且 Libral 需要在适当时间进行管理),再者,因为即使是完全成熟的 Libral 也总是存在达不到用户自定义的管理需求。

目前与 Libral API 进行交互的主要方式是通过 ralsh 命令行工具。它也提供了底层的 C API ,不过其仍处在不断的演变当中,主要的还是为简单的脚本任务做准备。该项目也提供了为 CRuby 提供语言绑定,其它语言也在陆续跟进。

未来 Libral 还将提供一个提供远程 API 的守护进程,它可以做为管理系统的基础服务,而不需要在管理节点上安装额外的代理。这一点,加上对 Libral 管理功能的定制能力,可以严格控制系统的哪些方面可以管理,哪些方面要避免干扰。

举个例子来说,一个仅限于管理用户和服务的 Libral 配置会避免干扰到在节点上安装的包。当前任何现有的配置管理系统都不可能控制以这种方式管理的内容;尤其是,需要对受控节点进行任意的 SSH 访问也会将该系统暴露不必要的意外和恶意干扰。

Libral API 的基础是由两个非常简单的操作构成的:“get” 用来检索当前资源的状态,“set” 用来设置当前资源的状态。理想化地实现是这样的,通过以下步骤:

  1. provider.get(names)->List[resource]
  2. provider.set(List[update])->List[change]

“provider” 是要知道怎样管理的一种资源的对象,就像用户、服务、软件包等等,Libral API 提���了一种查找特定资源的管理器(provider)的方法。

“get” 操作能够接收资源名称列表(如用户名),然后产生一个资源列表,其本质来说是利用散列的方式列出每种资源的属性。这个列表必须包含所提供名称的资源,但是可以包含更多内容,因此一个简单的 “get” 的实现可以忽略名称并列出所有它知道的资源。

“set” 操作被用来设置所要求的状态,并接受一个更新列表。每个更新可以包含 “update.is”,其表示当前状态的资源,“update.should” 表示被资源所期望的状态。调用 “set” 方法将会让更新列表中所提到的资源成为 “update.should” 中指示的状态,并列出对每个资源所做的更改。

ralsh 下,利用 ralsh user root 能够重新获得 “root” 用户的当前状态;默认情况下,这个命令会产生一个用户可读的输出,就像 Puppet 中一样,但是 ralsh 支持 --json 选项,可以生成脚本可以使用的 JSON 输出。用户可读的输出是:

  1. # ralsh user root
  2. user::useradd{'root':
  3. ensure=>'present',
  4. comment =>'root',
  5. gid =>'0',
  6. groups=>['root'],
  7. home =>'/root',
  8. shell =>'/bin/bash',
  9. uid =>'0',
  10. }

类似的,用户也可以用下面的形式修改:

  1. # ralsh user root comment='The superuser'
  2. user::useradd{'root':
  3. ensure=>'present',
  4. comment =>'The superuser',
  5. gid =>'0',
  6. groups=>['root'],
  7. home =>'/root',
  8. shell =>'/bin/bash',
  9. uid =>'0',
  10. }
  11. comment(root->The superuser)

ralsh 的输出列出了 “root” 用户的新状态和被改变的 comment 属性,以及修改了什么内容(在这种情形下单指 comment 属性)。下一秒运行相同的命令将产生同样的输出,但是不会提示修改,因为没有需要修改的内容。

 

清单 3. 使用 zip 文件

编写管理器(provider)

ralsh 编写新的管理器(provider)()是很容易的,也花费不了多少工夫,但是这一步骤是至关重要的。正因为如此,ralsh 提供了大量的调用约定,使得可以根据管理器所能提供的能力而调整其实现复杂性成为可能。管理器可以使用遵循特定调用约定的外部脚本,也可以以 C 实现并内置到 Libral 里面。到目前为止,有三种调用约定:

  • simple 调用约定是编写 shell 脚本用为管理器。
  • JSON 调用约定意味着可以利用 Ruby 或者 Python 脚本语言编写管理器。
  • [内部 C API8 可以被用来实现原生的管理器。

强烈建议使用 “simple” 或者 “JSON” 调用约定开始开发管理器。GitHub 上的 simple.prov 文件包含了一个简单的 shell 管理器框架,应该很容易的替换为你自己的管理器。python.prov 文件包含了利用 Python编写的 JSON 管理器框架。

利用高级脚本语言编写的管理器存在一个问题是,对于这些语言,在当前运行 Libral 的系统上需要包含所有的支持库在内运行环境。在某些情况下,这不是一个障碍;举例子来说,基于 “yum” 的包管理的管理器需要 Python 被安装在当前的系统上,因为 “yum” 就是用 Python 开发的。

然而在很多时候,无法预期一种 Bourne shell(Bash)之外的设计语言能够安装到所有的管理系统上。通常,管理器的编写者需要一个更加强大的脚本编译环境是实际需要。然而事与愿违,绑定一个完整的 Ruby 或 Python 作为解释器来运行将会增加 Libral 的大小超出了实际使用环境对资源的限制。另一方面,通常选择 Lua 或者 JavaScript 作为可嵌入的脚本编辑语言是不适应这种环境的,因为大多数的管理器的编写者不熟悉他们,通常情况下需要做大量的工作才能满足系统管理的实际需求。

Libral 绑定了一个 mruby 版本,一个小的、嵌入在 Ruby 的版本,提供给管理器的编写者一个稳定的基础以及功能强大的可实现的程序设计语言。mruby 是 Ruby 语言的一个完整实现,尽管其减少了大量的标准库支持。与 Libral 绑定的 mruby 包含了 Ruby 用于脚本编辑管理任务的大多数的重要标准库,其将基于管理器编写者的需求随着时间的推移得到加强。Libral 的 mruby 绑定了 API 适配器使编写管理器更适合 JSON 约定,比如它包含了简单的工具(如编译修改结构体文件的 Augeas)来解决解析和输出 JSON 的约定。mruby.prov 文件包含了利用 mruby 编写的 JSON 管理器框架实例。

 

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
 }

下一步工作

Libral 最关键的是下一步要使其增加广泛的可用性——从 预编译的 tarball 对于开发管理器的起步和深入是一个不错的方法,但是 Libral 也需要打包到主流的发行版上,并在上面可以找到。同样的,Libral 强大的功能取决于它附带的 管理器的集合,及需要被扩展覆盖一组核心管理功能。Libral 的网站上包含了一个 todo 列表列出了管理器的最迫切需求。

现在有多种方法能够提高不同用途的 Libral 的可用性:从编写更多程序语言的绑定,举例来说,Python 或者 Go;到使 ralsh 更容易在 shell 脚本中使用,除了现有的可读输出和 JSON 输出之外,可以很轻松的在 shell 脚本中格式化输出。在大规模的管理中使用 Libral 也能够在增加上面讨论过的远程 API 而得到改良,Libral 利用像 SSH 这样的传输工具实现更好的支持批量安装要求为各种架构提供预编译的 tarball,并且脚本基于所发现的目标系统架构选择正确的包。

Libral 和它的 API、它的性能能够不断地进化发展;一个有趣的可能性是为 API 增加提醒能力,这样做可以向系统报告资源在超出它的范围发生的变化。Libral 面临的挑战是保持小型化、轻量级和良好定义的工具,来对抗不断增加的用例和管理性能——我希望每一个读者都能成为这个挑战之旅的一部分。

如果这让你很好奇,我很想听听你的想法,可以用拉取请求的方式,也可以是增强请求方式,亦或者报告你对 ralsh 体验经验。

(题图:Internet Archive Book Images,修改:Opensource.com. CC BY-SA 4.0)


作者简介:

David Lutterkort - 戴维是一个 Puppet 的软件工程师,他曾经参与的项目有 Direct Puppet 和最好的供给工具 Razor。他是 Puppet 最早的编著者之一,也是配置编辑工具 Augeas 的主要作者。


via:

作者:David Lutterkort 译者:stevenzdg988 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-07/145860.htm

澳门皇冠844网站 2

这个脚本为根据提供的搜索路径和搜索模式搜索到的文件创建一个名为 “test.zip” 的 zip 文件。

这个例子做以下事情:

  •     第 9-15 行 - 请求用户提供搜索路径和搜索模式。
  •     第 23 行 - 创建一个新的名为 “test.zip” 的 ZipFile。
  •     第 25 行 - 使用 Ruby 中 “Find” 类中的 “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)”。

本文由澳门皇冠金沙网站发布于网络操作,转载请注明出处:一个提供资源和服务统一管理,使用Ruby编写脚本