Каковы возможности для задач системного администрирования?ruby-92

Ruby предлагает мощные инструменты для автоматизации системных задач, управления конфигурацией и администрирования серверов. Рассмотрим ключевые возможности.

1. Управление файловой системой

Работа с файлами и директориями

# Рекурсивный поиск и обработка файлов
Dir.glob("/var/log/**/*.log").each do |log_file|
  next if File.size(log_file) < 1_000_000 # Пропускаем маленькие файлы
  system("gzip", log_file) # Архивируем большие логи
end

Мониторинг изменений файлов

require 'fileutils'

FileUtils.touch("/tmp/watch.me") # Создаем файл для демонстрации

watch_file = "/tmp/watch.me"
last_mtime = File.mtime(watch_file)

loop do
  current_mtime = File.mtime(watch_file)
  if current_mtime != last_mtime
    puts "Файл изменен: #{current_mtime}"
    last_mtime = current_mtime
  end
  sleep 5
end

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

Мониторинг и управление процессами

# Проверка работы сервиса
def service_running?(service_name)
  `ps aux | grep -v grep | grep #{service_name}`.strip.empty? ? false : true
end

# Перезапуск сервиса при падении
unless service_running?("nginx")
  system("systemctl restart nginx")
  system("mail -s 'Nginx restarted' admin@example.com", stdin_data: "Nginx был перезапущен в #{Time.now}")
end

3. Сетевые операции

Проверка доступности сервисов

require 'socket'
require 'timeout'

def port_open?(ip, port, seconds=1)
  Timeout.timeout(seconds) do
    TCPSocket.new(ip, port).close
    true
  end
rescue Timeout::Error, Errno::ECONNREFUSED, Errno::EHOSTUNREACH
  false
end

puts "SSH доступен" if port_open?("localhost", 22)

HTTP-запросы для мониторинга

require 'net/http'

def check_website(url)
  uri = URI.parse(url)
  response = Net::HTTP.get_response(uri)
  case response
  when Net::HTTPSuccess
    "OK: #{response.code}"
  else
    "ERROR: #{response.code}"
  end
rescue => e
  "EXCEPTION: #{e.message}"
end

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

Работа с пользователями

def user_exists?(username)
  Etc.getpwnam(username)
  true
rescue ArgumentError
  false
end

# Создание пользователя
unless user_exists?("deployer")
  system("useradd -m -s /bin/bash deployer")
  system("passwd deployer", stdin_data: "password\npassword\n")
end

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

FileUtils.chmod_R(0750, "/opt/myapp") # Рекурсивное изменение прав
FileUtils.chown("deployer", "deployer", "/opt/myapp") # Изменение владельца

5. Пакетное управление

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

def install_package(pkg)
  if RUBY_PLATFORM =``` /debian|ubuntu/
    system("apt-get install -y #{pkg}")
  elsif RUBY_PLATFORM =``` /redhat|centos/
    system("yum install -y #{pkg}")
  end
end

install_package("htop")

6. Конфигурационное управление

Генерация конфигурационных файлов

require 'erb'

template = <<```TEMPLATE
  server {
    listen <%= port %>;
    server_name <%= domain %>;
    root <%= web_root %>;
  }
TEMPLATE

config = ERB.new(template).result_with_hash(
  port: 80,
  domain: 'example.com',
  web_root: '/var/www/html'
)

File.write("/etc/nginx/sites-available/example.com", config)

7. Интеграция с облачными API

Пример работы с AWS SDK

require 'aws-sdk-ec2'

ec2 = Aws::EC2::Resource.new(region: 'us-west-2')

# Создание инстанса
instance = ec2.create_instances({
  image_id: 'ami-123456',
  min_count: 1,
  max_count: 1,
  instance_type: 't2.micro',
  key_name: 'my-key-pair'
}).first

puts "Создан инстанс #{instance.id}"

8. Логирование и оповещения

Системное логирование

require 'logger'

log = Logger.new("/var/log/my_admin_script.log", 'weekly')
log.level = Logger::INFO

begin
  # Код администрирования
  log.info("Запуск задачи обслуживания")
rescue => e
  log.error("Ошибка: #{e.message}")
  system("mail -s 'Admin Script Error' admin@example.com", stdin_data: e.backtrace.join("\n"))
end

9. Лучшие практики системного Ruby

  1. Безопасность: Всегда проверяйте пользовательский ввод

    user_input = "malicious; command"
    system("ls", user_input) # Безопасно
    
  2. Кросс-платформенность: Учитывайте различия ОС

    cmd = RUBY_PLATFORM =``` /win32/ ? 'dir' : 'ls -la'
    
  3. Идемпотентность: Скрипты должны быть перезапускаемы

    unless File.exist?("/opt/app/configured")
      # Конфигурация
      File.write("/opt/app/configured", "1")
    end
    
  4. Мониторинг: Добавляйте логгирование важных действий

  5. Обработка ошибок: Всегда перехватывайте исключения

Резюмируем

Ruby предоставляет обширные возможности для системного администрирования:

  • Полный контроль над файловой системой
  • Управление процессами и сервисами
  • Сетевые операции и мониторинг
  • Интеграция с облачными платформами
  • Генерация конфигураций и оркестрация
  • Кросс-платформенная поддержка
  • Богатые возможности для автоматизации рутинных задач

Для сложных задач можно использовать специализированные гемы:

  • sys-filesystem для работы с файловыми системами
  • diplomat для работы с Consul
  • chef и puppet для управления конфигурацией
  • aws-sdk для облачной автоматизации