Ruby для системных администраторов

Использование возможностей Ruby для более эффективного администрирования систем

Помимо использования в качестве мощной платформы для разработки Web-приложений в сочетании с каркасом Rails, Ruby имеет другую, менее известную сторону — мощный язык написания сценариев, подобный Python или Perl. Большой потенциал Ruby обусловлен наличием множества внутренних и внешних библиотек, возможности которых могут быть использованы для решения важных вопросов написания скриптов. Эти вопросы возникают, как правило, в любом типовом рабочем окружении системного администрирования. Кроме того, программировать в приложении Ruby очень интересно!

Сантош Кришнамурти, штатный программист, IBM

Сантош Кришнамурти (Santhosh Krishnamoorthy) — инженер по тестированию TXSeries в IBM Software Labs, Бангалор, работающий в области межсистемных коммуникаций. В последнее время он также занимается и программированием на Ruby, Ruby on Rails и Python.



20.07.2011

Введение

Ruby — это богатый, бесплатно распространяемый, простой, гибкий, компактный и объектно-ориентированный язык написания сценариев. В последнее время пользуется огромной популярностью в сети. Этой популярностью он отчасти обязан очень мощной платформе для разработок Web-приложений, Rails, написанной на Ruby. Rails, или Ruby on Rails (ROR), как его называют, обеспечивает очень мощную платформу для быстрой и эффективной разработки Web-приложений. Он хорошо масштабируем, и многие существующие Web-сайты созданы с использованием Ruby on Rails.

Помимо использования Ruby on Rails как платформы разработок для Web-приложений, существует другая, менее известная сторона Ruby. Ruby — это мощный язык для написания скриптов, стоящий наравне с Python и Perl. У него колоссальные возможности, обеспечиваемые встроенными и внешними библиотеками, мощность которых может быть использована для решения проблем написания сценариев, — такие проблемы могут неожиданно возникнуть в любом рабочем окружении.

Системное администрирование — одно из таких рабочих окружений, требующее написания множества скриптов для облегчения работы и повышения её эффективности. Управление пользователями, управление процессами, управление файлами, управление пакетами программного обеспечения и другие основные автоматические операции лучше обрабатываются сценариями, чем рутинными ручными операциями. Ruby очень подходит для такого рода ситуаций. Для этого тут имеется хороший набор библиотек.

В этой статье я начну с примеров, показывающих, как приложение Ruby может быть использовано для упрощения некоторых основных потребностей системного администрирования, требующих написания сценариев. Эти примеры демонстрируют возможности Ruby как мощной альтернативы сценариев оболочки. Разумеется, эти примеры можно усовершенствовать, расширять или изменять по мере необходимости. После основных примеров я представлю очень мощную библиотеку системного администрирования для Ruby, называемую Cfruby. Эта библиотека включает широкий набор функциональных возможностей для облегчения системного администрирования и управления.

Эта статья предполагает наличие у читателя практических знаний Ruby. Базовые примеры, представленные здесь, используют "чистый" Ruby и, следовательно, должны работать в любой UNIX®-подобной системе с поддержкой Ruby, а также и в Windows®. Более продвинутые примеры с Cfruby могут работать только в UNIX-системе. Все примеры, приведенные ниже, проверены на Ruby версии 1.8.4 в Linux®. Они должны работать также и с последней версией Ruby.


Ruby в действии

Первый пример (листинг 1). Ruby ищет файлы, соответствующие данному шаблону в указанном пути, и выдает подробную информацию об этих файлах в удобном для пользователя виде. В примере используется только встроенный интерфейс Ruby, следовательно, пример будет работать на любой платформе, где запущен Ruby.

Кроме того, этот пример показывает мощь Ruby, значительно упрощающего подобные задачи. Здесь не просто эмуляция команды find в *nix, но надстройка над ней, демонстрирующая возможности 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       # В этом каталоге больше не искать.
     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 — использование метода ‘fnmatch’ класса ‘File’ для проверки, соответствует ли найденный файл указанному шаблону;
  • строка 25–34 — печатает детальную информацию о файле, если файл соответствует шаблону.

Вот пример вывода этого сценария (листинг 2).

Листинг 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-файлов и достаточно удобен для большинства случаев. Но здесь для создания zip-архивов и работы с ними мы используем другую удобную библиотеку Ruby, которая называется “rubyzip” (ее можно загрузить по ссылке в разделе «Ресурсы») . Отметим, что в этом примере используется «чистый» Ruby, и пример не зависит от наличия на машине утилит командной строки (листинг 3).

Установка rubyzip:

  • загрузите пакет gem для rubyzip по представленной ссылке и скопируйте его в систему. (На момент написания статьи это был ‘rubyzip-0.9.1.gem’);
  • запустите gem install rubyzip-0.9.1.gem
Листинг 3. Работа с архивными файлами
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       # В этом каталоге больше не искать.
     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’.

В этом примере:

  • строки 9–15 — это запросы пользователя на путь поиска и маску поиска;
  • строка 23 — создание архивного zip-файла, названного ‘test.zip.’
  • строка 25 — использование Ruby метода ‘find’ из класса ‘Find’ для прохода по указанному пути поиска;
  • строка 26 — проверяет, является ли найденный файл директорией. Если да и если он не скрыт ('.'), то выполняется его рекурсивный проход;
  • строка 33 — использование метода ‘fnmatch’ класса ‘File” чтобы проверить, соответствует ли найденный файл образцу;
  • строка 35 — добавление соответствующего шаблону файла в zip-архив.

Вот пример вывода (листинг 4).

Листинг 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 и установите его командой “gem install”.

Установка Cfruby:

  • скопируйте загруженный gem-файл в вашу систему (при написании этой статьи использовался ‘cfruby-1.01.gem’);
  • запустите gem install cfruby-1.01.gem.

Теперь приложение Cfruby установлено на вашу систему.

Начинаем использовать Cfruby

Продемонстрируем возможности Cfruby и то, как оно может значительно упростить системное администрирование и управление.

Существуют два основных способа получить доступ к выполняемым функциям Cfruby:

  • использование классов Ruby из libcfgruby напрямую;
  • использование обёртки cfrubyscript, обеспечивающей понятный интерфейс к libcfruby.

Использование классов Ruby из libcfgruby напрямую

Libcfruby — это суть Cfruby, объединение модулей, обеспечивающих различные функциональные возможности, упрощающие обслуживание и настройку системы. Чтобы использовать libcfruby, вам необходимо добавить ‘require_gem ‘cfruby’’ в начало сценария, после установки Cfruby gem. Это даст прямой доступ ко всем базовым модулям libcfruby, которые могут быть использованы в сценарии так, как вам нужно. Единственным недостатком этого метода является размер libcfruby и то, что все классы и методы расположены в своём собственном пространстве имен. Поэтому, чтобы получить доступ к любому классу, необходимо соотнести его с пространством имен. Например, libcfruby предоставляет метод получения типа вашей системы. Чтобы получить его, выполним следующие операции (листинг 5).

Листинг 5. Получение типа ОС с помощью libcfruby
require 'rubygems'

require_gem 'cfruby'

os = Cfruby::OS::OSFactory.new.get_os()

puts(os.name)

Это просто способ узнать имя вашей операционной системы. По мере дальнейшей работы с libcfruby сценарий беспорядочно наполнится всеми спецификациями пространства имен. И здесь пригодится следующий метод использования Cfruby.

Использование «обёртки» cfrubyscript, обеспечивающей более понятный интерфейс к libcfruby

Для использования cfrubyscript добавляем (листинг 6):

Листинг 6. Использование cfrubyscript
require 'rubygems'

require_gem 'cfruby'

require 'libcfruby/cfrubyscript'

Выполнение этой команды включает в скрипт cfrubyscript, что дает точный и более простой интерфейс для доступа к функциям libcfruby.

Что достигается использованием cfrubyscript:

  • экспорт набора переменных в глобальное пространство имен, таких как $os, $user, $proc и $sched;
  • извлечение большей части главных модулей в основное пространство имен – можно вызвать FileEdit.set вместо Cfruby::FileEdit.set;
  • добавление вспомогательных методов к String и Array, которые выполняют специфические команды Cfruby (установка программ, редактирование файлов и проч.);
  • также есть подробный журнал.

Итак, с громоздкими спецификациями пространства имен в сценариях покончено. Приведенный выше пример, выдающий тип ОС, теперь стал таким (листинг 7).

Листинг 7. Получение типа ОС с помощью cfrubyscript
require 'rubygems'

require_gem 'cfruby'

require 'libcfruby/cfrubyscript'

puts($os.name)

Всё просто переводится в один единственный вызов с использованием глобальной переменной $os. Cfruby — действительно мощное приложение, обеспечивающее широкое разнообразие функциональных возможностей для управления *nix-подобными системами.

Посмотрим на некоторые из них и на некоторые базовые примеры их использования.

Управление пользователями

Одной из наиболее распространенных и наиболее важных задач в любом администрировании систем является управление пользователями и группами. Cfruby обеспечивает мощный набор методов для осуществления этих задач в компактной и простой манере.

Это достигается использованием объекта UserManager который может быть получен из модуля ОС, как показано в листинге 8.

Листинг 8. Получение объекта UserManager с использованием libcfruby
require 'rubygems'

require_gem 'cfruby'

osfactory = Cfruby::OS::OSFactory.new()

os = osfactory.get_os()

usermgr = os.get_user_manager()

Если всё проделать в стиле cfrubyscript, то у нас уже будет присутствовать глобальный объект управления пользователями, доступный как $user, который может быть напрямую использован для вызова методов. Я буду следовать этому методу как наиболее простому и понятному для чтения.

Вот как его использовать, чтобы создать и удалить пользователя (листинг 9).

Листинг 9. Управление пользователями с использованием cfrubyscript
require 'rubygems'

require_gem 'cfruby'

require 'libcfruby/cfrubyscript'

$user.adduser('newusername','password')

$user.deleteuser('usernametodelete',true)

Что происходит в этом примере:

  • строки 1, 2 — как обычно, включаем libcfruby и cfrubyscript в сценарий;
  • строка 3 — создает нового пользователя с именем, указанным как ‘newusername’ и с паролем, указанным во втором аргументе;
  • строка 4 — удаляет пользователя с именем пользователя, указанным как ‘newusername’. Второй аргумент может быть истинным или ложным, указывающим, что нужно удалять домашнюю директорию удаляемого пользователя.

Аналогично, возможны операции над группами с использованием методов addgroup( ) и deletegroup( ) в объекте UserManager.

Управление процессами

Ещё одна важная задача администратора — отслеживание запущенных процессов и управление ими. Cfruby также может быть здесь полезен, обеспечивая возможность эффективного наблюдения за процессами.

Вот как эта задача решается с помощью Cfruby (листинг 10).

Листинг 10. Управление процессами с использованием cfgrubyscript
require 'rubygems'

require_gem 'cfruby'

require 'libcfruby/cfrubyscript'

$proc.kill($proc.vim)

'ps –aef'.exec()

Что происходит в этом примере:

  • строка 3 — использование глобального объекта $proc для того, чтобы завершить процесс ‘vim’, указанный как аргумент. $proc.vim — это объект типа ProcessInfo процесса ‘vim’, запущенного в системе. Cfrubyscript создаёт их автоматически;
  • строка 4 — запуск нового процесса со специализированной командой ‘ps-aef’. Метод запуска вызывается напрямую из командной строки.

Управление пакетами программ

Управление программным обеспечением в системе — еще одна задача, которую должен обеспечивать системный администратор. Cfruby предоставляет методы для простой установки и удаления программ в системе (листинг 11).

Листинг 11. Управление программами с помощью cfrubyscript
require 'rubygems'

require_gem 'cfruby'

require 'libcfruby/cfrubyscript'

all = $pkg.packages()

installed = $pkg.installed_packages()

ruby.install()

Что происходит:

  • строка 3 — использование глобального объекта $pkg PackageManager, созданного cfrubyscript, и получение всех пакетов, присутствующих в системе, с помощью вызова метода packages();
  • строка 4 — список всех установленных пакетов;
  • строка 5 — устанавливает пакет Ruby вызовом метода install. Возможность прямого вызова вспомогательного метода установки непосредственно из имени пакета.

Это уровень, до которого всё упрощается.

Управление файлами

Cfruby также помогает в управлении файлами. Создание, редактирование, удаление, назначение владельца, смена прав доступа и многое другое делается просто методами, предоставляемыми Cfruby (листинг 12).

Листинг 12. Управление файлами с использованием cfrubyscript
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 — это не только разработка Web-приложений на базе Rails. Он также может использоваться как мощный язык сценариев и очень эффективная альтернатива обычному написанию сценариев в оболочке, в большинстве случаев используемых для написания скриптов системного администрирования.

С собственным набором встроенных модулей и несколькими внешними библиотеками Ruby может сделать системное администрирование более эффективным и, несомненно, более простым. Ruby — это очень полезный и мощный инструмент, который должен быть в наборе каждого системного администратора.

Ресурсы

Научиться

  • Оригинал статьи: Ruby for systems administrators(EN)
  • Ruby programming language: официальный сайт Ruby (EN)
  • Programming Ruby: The Pragmatic Programmer's Guide. Хорошее руководство для изучения программирования на Ruby. (EN)
  • AIX и UNIX : хотите большего? В разделе по AIX и UNIX сайта developerWorks размещены сотни информативных статей и пособий для пользователей начального, среднего и продвинутого уровней.(EN)

Получить продукты и технологии

  • Ruby: загрузите последнюю версию Ruby(EN)
  • Cfruby: загрузите библиотеку системного администрирования для Ruby.(EN)
  • RubyZip: загрузите библиотеку для обработки zip-архивов для Ruby.(EN)

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=AIX и UNIX
ArticleID=741796
ArticleTitle=Ruby для системных администраторов
publish-date=07202011