Ruby предлагает мощные инструменты для автоматизации системных задач, управления конфигурацией и администрирования серверов. Рассмотрим ключевые возможности.
# Рекурсивный поиск и обработка файлов
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
# Проверка работы сервиса
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
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)
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
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") # Изменение владельца
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")
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)
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}"
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
Безопасность: Всегда проверяйте пользовательский ввод
user_input = "malicious; command"
system("ls", user_input) # Безопасно
Кросс-платформенность: Учитывайте различия ОС
cmd = RUBY_PLATFORM =``` /win32/ ? 'dir' : 'ls -la'
Идемпотентность: Скрипты должны быть перезапускаемы
unless File.exist?("/opt/app/configured")
# Конфигурация
File.write("/opt/app/configured", "1")
end
Мониторинг: Добавляйте логгирование важных действий
Обработка ошибок: Всегда перехватывайте исключения
Ruby предоставляет обширные возможности для системного администрирования:
Для сложных задач можно использовать специализированные гемы:
sys-filesystem
для работы с файловыми системамиdiplomat
для работы с Consulchef
и puppet
для управления конфигурациейaws-sdk
для облачной автоматизации