Содержание


Основы применения Python в администрировании Linux

Comments

Стандартные и нетривиальные задачи системного администратора

В обязанности любого системного администратора входит решение большого количества разнообразных задач, призванных «облегчить жизнь» как ему самому, так и пользователям. То, с чем приходится сталкиваться постоянно, – мониторинг серверов или отдельных процессов, резервное копирование баз данных, просмотр логов с последующей выборкой необходимой информации, настройка и совершенствование системы информационной безопасности, заведение и редактирование пользовательских учетных записей и т.д.

Автоматизация выполнения повседневных задач избавляет системного администратора от необходимости совершать множество последовательных действий вручную, снижает до минимума вероятность совершения ошибок и позволяет сосредоточить внимание на более важных проблемах. Linux-based дистрибутивы обладают для этого достаточно широким выбором инструментария, что, в свою очередь, зачастую вызывает споры о целесообразности использования стандартных средств командного интерпретатора или полнофункционального языка программирования для решения однотипных задач.

Python vs Bash

Bash (Bourne Again Shell) – наиболее часто используемая командная оболочка по умолчанию в операционных системах GNU/Linux. Она включает в себя простой язык программирования, который позволяет при помощи условных операторов и операторов цикла использовать утилиты и программы операционной системы для написания как простых, так и сложных скриптов. В этом плане bash, несомненно, обладает некоторыми преимуществами, в частности, универсальностью и доступностью. Для того чтобы написать скрипт на bash, установка дополнительных пакетов не требуется – достаточно создать файл вида script_name.sh с последовательно исполняемыми операциями и запустить его либо добавить в качестве задачи планировщика cron.

Вот далеко не полный список задач, которые можно решить с использованием bash-скрипта:

  • вывод нескольких последних строк лога или поиск и выборка ключевых слов с последующим сохранением в отдельный файл;
  • архивирование каталога с данными с последующей отправкой архива на удаленный компьютер по ssh или telnet;
  • настройка системы бэкапа файлов базы данных с использованием дампинга;
  • запрос информации о конфигурации нескольких компьютеров в сети и отправка файла с результатами по e-mail;
  • поиск дубликатов файлов на диске с последующим выводом списка имен и запросом на удаление;
  • рекурсивная замена владельцев отдельных файлов и каталогов на диске.

Стоит отметить, что возможности командного интерпретатора зачастую используются не полностью. Многие администраторы выбирают Bash для написания простых или средних по сложности скриптов, а более крупные проекты или специфические задачи, где требуется работа с разнообразными входными данными, многомерными массивами, сокетами доверяют Perl, Python или Ruby. Отчасти это связано с проблемами переносимости bash-скриптов на другие платформы, например, Windows, отчасти с тем, что Bash воспринимается скорее как средство автоматизации работы с файлами и утилитами, чем полноценный скриптовый язык, даже несмотря на наличие в арсенале sed и awk . Еще одним минусом Bash является то, что при выполнении скрипта каждая запущенная с его помощью утилита создает свой процесс, что отражается на скорости выполнения и уровне использования ресурсов системы.

В отличие от Bash, Python является полноценным объектно-ориентированным языком программирования. Он входит в состав большинства распространенных дистрибутивов GNU/Linux, что позволяет использовать его в качестве альтернативной основы для написания скриптов, решающих задачи системного администрирования. Вот лишь несколько причин, по которым выбор нередко падает на Python:

  • удобочитаемость и компактность кода. Благодаря соблюдению четких синтаксических правил скрипт, написанный на Python, будет понятен любому IT-специалисту, знакомому с программированием, даже если он видит этот код впервые. В то же время, при внесении изменений следует обращать внимание на правильную расстановку отступов – в Python они используются в качестве разграничителей блоков кода;
  • наличие (даже в стандартной комплектации) большого количества модулей, подключаемых с помощью оператора import. Каждый из модулей состоит из набора функций и методов, которые поддерживают основные системные протоколы и форматы и легко используются при написании собственного кода. Таким образом, экономится время, а скрипт будет выглядеть более структурированным. Возможности Python также позволяют написать и подключить собственный модуль, если поставленная задача отличается специфичностью решения;
  • кроссплатформенность. Скрипты Python работают и в среде Windows, и в MacOS, и в UNIX, включая FreeBSD и GNU/Linux. Этот язык широко используется и на мобильных платформах, таких как Symbian, Android. В этом преимущество Python – Bash такими возможностями не обладает и является «встроенным» инструментарием только для семейств *NIX, *BSD и GNU/Linux. Однажды написанный на Python, скрипт с большой долей вероятности будет работать на разных платформах, решая схожие задачи, при условии, что код не будет содержать специфических для конкретной операционной системы функций.

Python является подходящим инструментарием для решения следующих задач администрирования:

  • парсинг лога или конфигурационного файла с использованием регулярных выражений;
  • разработка приложений, в том числе нестандартных, для работы с базами данных MySQL, Oracle, PostgreSQL, Sybase и др.;
  • сбор и анализ статистики интернет-трафика с нескольких IP-адресов;
  • преобразование данных в различные форматы, например, конвертация .ini-файлов в текст при помощи модуля ConfigParser;
  • работа с файлами сервера при помощи FTP-клиента;
  • поднятие простого прокси-сервера;
  • мониторинг работоспособности сервиса, запущенного на сервере, с отправкой предупреждений на e-mail администратора в случае сбоя;
  • поднятие ppp-соединения с использованием программы автодозвона;
  • поиск дубликатов с запросом на удаление или перемещение в каталоге с большим количеством файлов;
  • проверка целостности архивов бэкапа при помощи алгоритма md5;
  • и т.д.

Некоторые часто используемые модули Python

Стандартный инструментарий Python позволяет системному администратору достаточно легко создавать полезные в работе скрипты или приложения вне зависимости, идет ли речь об операциях с файлами и каталогами (модули os, re, glob, fileinput, zipfile и др.), сетевых протоколах (модули socket, ftplib, urlib, poplib, imaplib, smtplib, telnetlib и др.) или базах данных (модули mySQLdb, cx_Oracle, psycopg2, Sybase и др.). Описываемые ниже примеры наглядно показывают, каким образом возможности Python используются как для решения повседневных задач (таких как создание дампа базы данных MySQL, получение статистики использования ресурсов сервера), так и для написания простого FTP-клиента, выполняющего поиск файлов по шаблону и скачивание их в локальный каталог.

socket

Модуль socket позволяет создавать программные интерфейсы для обмена данными между процессами на стороне и клиента, и сервера. По умолчанию он поддерживает создание сокетов домена Internet для IPv4 (константа socket.AF_INET). При необходимости также есть возможность создать сокет домена UNIX (константа socket.AF_UNIX), если процессы локальны. Модуль socket участвует в создании различных сетевых приложений, например, в связке веб-сервер/браузер, почтовый сервер/почтовый клиент. Для системного администратора примером использования модуля socket может служить следующий скрипт srvstat.py :

#!/usr/bin/python
import os. re
from socket import *
class Srvstat:
    def __init__(self, host='serverhost.ru', port=52001):
        self.socket = socket(AF_INET, SOCK_STREAM)
        self.socket.bind((host, port))
        self.socket.listen(5)
    def process(self):
            while 1:
               csocket, caddress = self.socket.accept()
               csocket.send('Connection established. Ready for request.\n')
                 while 1:
                    request = csocket.recv(64)
                    if re.match('get\s+srvstat', request, re.IGNORECASE):
csocket.send(os.popen('/usr/bin/vmstat 1 10').read())
csocket.send(os.popen('/usr/bin/netstat -ta').read())
                   elif re.match('quit', request, re.IGNORECASE):
                               break
                        else:
csocket.send('Unknown command.\n')
                   csocket.close()
if __name__ == '__main__':
             serv = Srvstat()
             serv.process()

Сервер serverhost.ru ожидает входящих соединений на порту 52001. При успешном подключении с использованием telnet он выдаст приглашение «Connection established. Ready for request» (Соединение установлено. Ожидается запрос). Единственную команду, которую сервер воспримет, будет get srvstat – она последовательно выведет информацию, полученную с помощью утилит vmstat и netstat. При попытке ввода любой другой команды будет выведено соответствующее уведомление «Unknown command» (Команда не найдена). Таким образом, администратор получит статистику использования ресурсов сервера за последние 10 секунд, а также сможет просмотреть список установленных и ждущих TCP-соединений. Выход осуществляется при помощи quit.

ftplib

Для реализации простого FTP-клиента в Python используется модуль ftplib. С его помощью можно просмотреть список файлов в заданном каталоге на ftp-сервере, скачать нужные файлы по заданному шаблону или, наоборот, закачать их на сервер – таким образом, модуль способен выполнять все основные функции, присущие FTP-клиентам. Конечно, чтобы не "изобретать велосипед", можно просто воспользоваться одним из множества уже написанных под Linux программ, например, NcFTP. Однако если задачи системного администратора более специфичны или выходят за пределы простых команд get/put, ftplib в сочетании с другими модулями Python может стать альтернативным решением проблемы. Приведенный ниже скрипт соединяется с сервером ftp и выводит список файлов из указанного каталога в соответствии с заданной маской поиска (в данном примере это все файлы с расширением *.php). После этого найденные файлы скачиваются в локальный каталог пользователя, и соединение закрывается.

#!/usr/bin/python
import os
from ftplib import FTP
ftpresource = 'ftp.somehost.ru'
ftplogin = 'yourlogin'
ftppassword = 'yourpass'
todir = '/usr/home/myfiles/ftp' # задаем каталог на локальном компьютере,
                                # куда будут 
                                # скачиваться файлы
ftp = FTP(ftpresource)
ftp.login(ftplogin, ftppassword)
ftp.cwd('directory')            # переходим в каталог,
                                # откуда будем скачивать файлы
for files in ftp.nlst('*.php'):
      ftp.retrbinary('RETR '+files, open(os.path.join(todir, files), 'wb').write, 1024)
ftp.close()

Database API 2.0

Взаимодействие языка Python с различными базами данных описывается в соответствующей спецификации – Python Database API 2.0. Благодаря универсальности используемых модулей базовая реализация доступа к базе данных, типов объектов, конструкторов и расширений применима для любой БД, поддерживаемой Python.

Для обработки запросов базы данных, согласно спецификации, используются объекты подключения и объекты курсоров. В частности, доступ к базе реализуется при помощи метода connect(), к которому применяются соответствующие параметры базы:

import mySQLdb
db = mySQLdb.connect(db='dbname', host='host', user='dbuser', passwd='dbpasswd')

При разработке интерфейса для работы с выбранной базой данных следует учитывать особенности ее параметров и корректировать метод connect() в соответствии с ними. В целом базовая структура интерфейса, написанная на Python, достаточно проста для понимания и реализации. Следующим шагом после подключения к базе является объявление объекта курсора (в терминологии БД курсором называется тот ее объект, который позволяет управлять контекстом выборки):

cursor = db.cursor()

Несмотря на то что некоторые БД, например MySQL, не поддерживают курсоры, они все равно будут эмулироваться, поэтому объявление объекта курсора в любом случае необходимо. После этого можно переходить к выполнению запроса:

cursor.execute("select * from ANY_TABLE")

Для получения результата запроса используется одна из следующих команд:

cursor.fetchone()    # возвращает результат выборки построчно 
cursor.fetchall()    # возвращает полный результат выборки
                     # и читает его построчно

По окончании работы с базой необходимо завершить работу с курсором и закрыть соединение при помощи метода close():

cursor.close()
db.close()

Одной из основных задач системного администратора является организация резервного копирования базы данных. В сети существует достаточно много ресурсов, где выложены подробные how-to, описывающие готовые backup-скрипты на Python. В частности, сама процедура создания дампа может выглядеть, например, следующим образом:

import time, subprocess
import mySQLdb

mysql_dir = '/usr/bin/'
backup_dir = '/usr/backup/dbarchive/'
db = mySQLdb.connect(db='dbname', host='dbhost', user='dbuser', passwd='dbpasswd')
cursor = db.cursor()
cursor.execute("show databases")  

for db in cursor.fetchall():
             command = '%s/mysqldump -u%s -p%s %s > %s%s-%s.sql' % 
             (mysql_dir, dbuser, dbpasswd, db, 	
             backup_dir, db, time.strftime("%Y%m%d-%H:%M"))
try:
             retcode = subprocess.call(command, shell=True)
             if retcode == 0:
                         print "Dump completed"
except Exception, e:
             print "Dump failed"

iPython

iPython представляет собой альтернативную интерактивную оболочку для работы с Python, поддерживающую расширенный список команд, включая более шестидесяти специальных, или "магических", функций (%function_name). Она является хорошим подспорьем для системного администратора, позволяя сочетать возможности bash и Python, среди которых выделяются следующие:

  • функция автодополнения по Tab
  • возможность создания псевдонимов для часто используемых системных команд при помощи функции %alias
  • запуск скрипта в интерактивном режиме при помощи функции %run
  • возможность кэширования трех последних результатов вывода при помощи соответствующих переменных _, __ и ___
  • просмотр истории всех вводимых данных с использованием функции %hist
  • префикс ! для запуска shell-команд
  • и др.

При желании iPython также можно запустить в режиме командной оболочки, используя встроенный профиль sh:

$ ipython -p sh

Заключение

Python – удобный инструмент для решения задач системного администрирования, как повседневных, так и более специфических. Он одинаково подходит для создания как скриптов, так и более сложных приложений, в особенности сетевых, а также может служить заменой стандартному shell в Linux. Так как Python является полноценным скриптовым языком, предпочтение в его использовании отдается специфическим задачам или тем, для решения которых возможностей bash недостаточно. В решении же повседневных задач выбор нередко падает на bash по причине его универсальности и доступности, однако преимущество Python в его удобстве и большей функциональности.


Ресурсы для скачивания


Комментарии

Войдите или зарегистрируйтесь для того чтобы оставлять комментарии или подписаться на них.

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Linux
ArticleID=478544
ArticleTitle=Основы применения Python в администрировании Linux
publish-date=03302010