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

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

Начните работать с Python, который позволяет управлять UNIX(®) системами и стимулирует писать хорошо спроектированный код. Python – это легкий для изучения язык скриптов с открытым исходным кодом, помогающий системным администраторам делать свою работу быстрее. Также он может сделать выполнение задач системного администрирования более интересными.

Джеймс Ноултон, инженер по качеству ПО, Automated Data Processing

Photo of James KnowltonДжеймс Ноултон работает инженером по качеству ПО в Automated Data Processing (ADP), Inc. Он возглавляет работу по контролю качества в проектах ADP, связанных с сетевым видео и интеграцией компьютерной телефонии. Он обладает обширным опытом применения технологий с открытым исходным кодом, в том числе Python, Ruby, PHP, Apache и MySQL. Вы можете связаться с ним по адресу james@jamesknowlton.com.



03.09.2010

Введение

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

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

О модулях

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

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

Почему Python?

Python имеет немало достоинств, благодаря которым его можно рекомендовать к использованию

  • Это бесплатный проект с открытым исходным кодом
  • Его легко учить. Многие пользователи находят его синтаксис гораздо более близким к английскому языку по сравнению с другими скриптовыми языками.
  • Это зрелый язык. 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.
  • AIX и UNIX: в разделе AIX и UNIX на developerWorks представлено огромное количество информации по всем аспектам администрирования систем AIX и расширения навыков в UNIX (EN).
  • wiki-раздел AIX 6: среда совместной разработки технической документации AIX (EN).
  • В Python-разделе книжного магазина Safari вы можете найти книги на эту и другие технические темы. (EN)
  • Книжный магазин Safari: в этой электронной справочной библиотеке вы можете найти специализированные технические материалы (EN).
  • Следите за новостями в разделе технических мероприятий и Web-трансляций (EN) developerWorks.
  • Подкасты: настраивайтесь на одну волну с техническими экспертами IBM и перенимайте их опыт (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, Open source
ArticleID=515578
ArticleTitle=Python для системных администраторов
publish-date=09032010