Содержание


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

Как упростить системное администрирование (и сделать его интереснее)

Comments

Каждому системному администратору постоянно приходится решать множество проблем. Управление пользователями, свободным местом на дисках, процессами, устройствами и резервными копиями может стать для системного администратора причиной потери волос, чувства юмора или рассудка. В работе могут помочь shell-скрипты, но зачастую они имеют досадные ограничения. Именно в таких случаях полноценный язык скриптов, такой как Python, может сделать скучную работу легкой и даже, не побоюсь сказать, интересной.

Приведенные в этой статье примеры демонстрируют различные возможности Python, которые вы можете использовать на практике. Проработав эти примеры, вы получите представление о мощи Python.

О модулях

Модуль – это важная концепция в Python. Его можно определить как ресурс, который вы импортируете для того, чтобы впоследствии использовать. Этот процесс можно сравнить с тем как кто-нибудь берет нужные документы из архива и кладет их на стол, готовясь к работе. Модули импортируют с помощью команды import, присутствующей в начале каждого нашего примера. Есть модули для работы с базами данных и сервисами операционной системы, сетевого программирования и сотен других полезных областей.

Принимаем Python на вооружение

Python – это полноценный и мощный язык программирования, предоставляющий множество возможностей. Изучить его полностью – это огромная работа. Однако следует помнить, что многие возможности Python, такие как средства создания GUI, не представляют серьёзной ценности для системных администраторов. Именно поэтому в этой статье используются специально подобранные примеры: в них демонстрируются навыки и приёмы, которыми вам нужно владеть, чтобы эффективно писать скрипты Python для управления системами.

Замечания по поводу примеров

  • Код в каждом примере заключен между инструкциями try: и except:.Это элементарная реализация обработки ошибок. В Python есть обширная поддержка обработка исключительных ситуаций всех типов, однако для целей наших примеров я оставил обработку ошибок простой.
  • Эти примеры запускались на Python версии 2.5 на Linux®-машине, однако они должны работать на любой UNIX®/Linux машине.
  • Несомненно, вы будете задумываться о том, как можно улучшить эти скрипты. Это здорово! Скрипты Python можно легко изменять и подгонять под свои нужды без необходимости перекомпилировать код.

Пример 1. Поиск файлов и отображение прав доступа к ним в удобном для восприятия формате

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

Этот скрипт выполняет три задачи:

  1. запрашивает у пользователя шаблон для поиска;
  2. выполняет поиск;
  3. отображает пользователю результаты.

При написании скрипта постоянно задавайте себе вопрос: «Для какой задачи предназначен этот код?» Это может сделать вашу работу более сфокусированной и эффективной.

Листинг 1. Поиск файлов и отображение результата в виде имен файлов с правами доступа к ним
import stat, sys, os, string, commands


try:
    #запрашиваем у пользователя шаблон для поиска
    pattern = raw_input("Enter the file pattern to search for:\n")
    #выполняем команду 'find' и заносим результат ее выполнения в переменную
    commandString = "find " + pattern
    commandOutput = commands.getoutput(commandString)
    findResults = string.split(commandOutput, "\n")

    #отображаем вывод команды find вместе с правами доступа
    print "Files:"
    print commandOutput
    print "================================"
    for file in findResults:
        mode=stat.S_IMODE(os.lstat(file)[stat.ST_MODE])
        print "\nPermissions for file ", file, ":"
        for level in "USR", "GRP", "OTH":
            for perm in "R", "W", "X":
                if mode & getattr(stat,"S_I"+perm+level):
                    print level, " has ", perm, " permission"
                else:
                    print level, " does NOT have ", perm, " permission"
except:
    print "There was a problem - check the message above"

Программа выполняет следующие шаги:

  1. запрашивает у пользователя шаблон для поиска (строки 7—9);
  2. выводит список найденных файлов (строки 12—14);
  3. с помощью модуля stat получает информацию о правах доступа к каждому найденному файлу и выводит их на экран (строки 15—23).

Как выглядит работающая программа, показано в листинге 2.

Листинг 2. Работа программы из первого примера
$ python example1.py
Enter the file pattern to search for:
j*.py

FILES FOUND FOR PATTERN  j*.py :
jim.py
jim2.py
================================

Permissions for file  jim.py :
USR     R
USR     W
USR     X
GRP     -
GRP     -
GRP     -
OTH     -
OTH     -
OTH     -

Permissions for file  jim2.py :
USR     R
USR     W
USR     X
GRP     R
GRP     -
GRP     X
OTH     R
OTH     -
OTH     X

Пример 2. Выполнение действий с tar-архивом на основе выбора из меню

В предыдущем примере программа запрашивала у пользователя, какой шаблон поиска следует использовать. Другим способом передачи информации от пользователя программе являются аргументы командной строки. Программа в листинге 3 иллюстрирует, как это можно сделать в Python. Программа принимает через аргумент командной строки имя tar-архива, а потом предлагает пользователю выбрать одно из действий.

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

find

и чтения ее результата использовался модуль command. Такой подход иногда может быть неуклюжим, кроме того, он не совсем в стиле Python. В этом примере для открытия tar-архива используется модуль tarfile, который позволяет использовать атрибуты и методы Python при манипуляциях с файлом. Многие модули Python позволяют делать вещи, которые нельзя выполнить в командной строке.

Это хороший пример реализации меню в Python. В зависимости от вашего выбора программа выполняет различные действия:

  • если нажать 1, программа предложит ввести имя файла из архива и извлечет его в текущую директорию;
  • если нажать 2, программа предложит ввести имя файла, после чего выдаст информацию о нем;
  • если нажать 3, программа выдаст список всех находящихся в архиве файлов.
Листинг 3. Выполнение действий с tar-архивом на основе выбора из меню
import tarfile, sys

try:
    #открываем tar-файл
    tar = tarfile.open(sys.argv[1], "r:tar")

    #выводим меню и запрашиваем действие у пользователя
    selection = raw_input("Enter\n\
    1 to extract a file\n\
    2 to display information on a file in the archive\n\
    3 to list all the files in the archive\n\n")

    #в соответствии с выбором пользователя выполняем действие
    if selection == "1":
        filename = raw_input("enter the filename to extract:  ")
        tar.extract(filename)
    elif selection == "2":
        filename = raw_input("enter the filename to inspect:  ")
        for tarinfo in tar:
            if tarinfo.name == filename:
                print "\n\
                Filename:\t\t", tarinfo.name, "\n\
                Size:\t\t", tarinfo.size, "bytes\n\
    elif selection == "3":
        print tar.list(verbose=True)
except:
    print "There was a problem running the program"

Программа выполняет следующие шаги:

  1. открывает tar-файл (строка 5);
  2. выводит меню и предлагает пользователю выбрать действие (строки 8—11);
  3. если нажать 1 (строки 14—16), то извлекается файл из архива;
  4. если нажать 2 (строки 17—23), то выводится информация о выбранном файле;
  5. если нажать 3 (строки 24—25), то выводится информация о всех файлах архива;

Работа программы показана в листинге 4.

Листинг 4. Пользовательское меню для второго примера
$ python example2.py jimstar.tar
Enter
1 to extract a file
2 to display information on a file in the archive
3 to list all the files in the archive

Пример 3. Проверка запущенного процесса и вывод информации о нем в удобном для восприятия формате

Одной из самых важных обязанностей системного администратора является отслеживание выполняющихся процессов. Скрипт в листинге 5 предлагает вам некоторые идеи для решения этой задачи. Программа пользуется возможностью UNIX обрабатывать командой grep вывод какой-либо другой команды, что позволяет автоматически сократить количество данных, которые Python должен проанализировать.

Также в программе используется модуль string. Познакомьтесь с ним поближе – вы будете часто его использовать.

Листинг 5. Вывод информации о запущенном процессе в удобном для восприятия формате
import commands, os, string

program = raw_input("Enter the name of the program to check: ")

try:
    #выполняем команду ps и помещаем результат ее выполнения в список
    output = commands.getoutput("ps -f|grep " + program)
    proginfo = string.split(output)

    #выводим результат
    print "\n\
    Full path:\t\t", proginfo[5], "\n\
    Owner:\t\t\t", proginfo[0], "\n\
    Process ID:\t\t", proginfo[1], "\n\
    Parent process ID:\t", proginfo[2], "\n\
    Time started:\t\t", proginfo[4]
except:
    print "There was a problem with the program."

Программа выполняет следующие шаги:

  1. запрашивает имя процесса для проверки и помещает его в переменную (строка 3);
  2. выполняет команду ps и помещает ее результат в список (строки 7—8);
  3. выводит детальную информацию о процессе (строки 11—16).

Работа программы показана в листинге 6.

Листинг 6. Работа программы из третьего примера
$ python example3.py
Enter the name of the program to check: xterm

    Full path:          /usr/bin/xterm
    Owner:              knowltoj
    Process ID:         3220
    Parent process ID:  4308
    Time started:       16:51:46

Пример 4. Проверка имен пользователей и паролей на соответствие правилам безопасности

Управление безопасностью – это очень важная часть работы любого системного администратора. Как будет показано в последнем примере, Python может сделать эту работу проще.

В программе, показанной в листинге 7, используется модуль pwd для доступа к базе данных паролей. Программа проверяет имена пользователей и пароли на соответствие правилам безопасности (в данном случае имя пользователя должно быть не короче шести символов, а пароль – не короче восьми символов).

Два предупреждения:

  • эта программа будет работать только в том случае, если у вас есть полные права для работы с файлом /etc/passwd;
  • скрипт не будет работать, если вы используете "теневые" пароли (однако на этот случай в Python 2.5 есть модуль spwd).
Листинг 7. Проверка имен пользователей и паролей на соответствие правилам безопасности
import pwd

#инициализируем счетчики
erroruser = []
errorpass = []

#запрашиваем базу данных паролей
passwd_db = pwd.getpwall()

try:
    #проверяем каждое имя пользователя и пароль
    for entry in passwd_db:
        username = entry[0]
        password = entry [1]
        if len(username) < 6:
            erroruser.append(username)
        if len(password) < 8:
            errorpass.append(username)

    #выводим результаты на экран
    print "The following users have an invalid userid (less than six characters):"
    for item in erroruser:
        print item
    print "\nThe following users have invalid password(less than eight characters):"
    for item in errorpass:
        print item
except:
    print "There was a problem running the script."

Программа выполняет следующие шаги:

  1. инициализирует счетчики неправильных имен пользователей и паролей (строки 4—5);
  2. открывает базу данных паролей и записывает данные в список (строка 8);
  3. проверяет правильность имени пользователя и пароля (строки 12—18);
  4. выводит списки не прошедших проверку имен пользователей и паролей (строки 21—26).

Работа программы показана в листинге 8.

Листинг 8. Работа программы из четвертого примера
$ python example4.py
The following users have an invalid userid (less than six characters):
Guest

The following users have invalid password(less than eight characters):
Guest
johnsmith
joewilson
suejones

Другие области применения скриптов

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

Вот некоторые области, в которых Python может оказаться очень полезным:

  • Управление серверами. Проверка установки патчей определенного приложения на группе серверов и автоматические обновления.
  • Оповещение об ошибках. Автоматическая рассылка электронных писем при появлении в syslog-е ошибок определенного типа.
  • Работа с сетью. Создание Telnet-соединения с сервером и отслеживание состояния соединения.
  • Тестирование Web приложений. Использование бесплатных инструментов эмуляции Web-браузера для проверки функциональности и производительности Web-приложения.

Это всего лишь несколько примеров. Я уверен, что у вас возникнут и свои собственные идеи.

Заключение

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


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


Похожие темы

  • Оригинал статьи: Python for system administrators
  • The Python tutorial (EN): это руководство - отличный источник основной информации о языке.
  • Официальный Web сайт Python : на этом сайте размешена различная информация о Python и множество ссылок для загрузки.
  • The Python Cookbook (EN): этот сайт поддерживается компанией ActiveState и представляет собой сообщество, в котором пользователи предлагают для всеобщего доступа скрипты практически на любую тематику программирования.
  • Planet Python (EN): на этом сайте рассказывается все о Python.
  • wiki-раздел AIX 6: среда совместной разработки технической документации AIX (EN).
  • В Python-разделе книжного магазина Safari вы можете найти книги на эту и другие технические темы. (EN)
  • Загрузите самую свежую версию Python.(EN)

Комментарии

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

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