Хватит работать сверхурочно, пора работать рационально для системных администраторов



бет16/20
Дата25.07.2016
өлшемі2.53 Mb.
#220661
1   ...   12   13   14   15   16   17   18   19   20

Serveг1» make aliases.db

newaliases

Done updating aliases Serverltt

Вот так! Команда make прочитала свой файл конфигурации, выясни­ла, что файл aliases новее, чем aliases.db (сравнив их метки времени), и определила, что запуск команды newaliases приведет к обновлению файла aliasesAb. Попробуем запустить make еще раз:

Serverltt make aliases.db

Server18

Сообщение об обновлении не выводится. Почему? Потому что теперь согласно меткам времени ничего делать не нужно, ведь файл aliases. db новее файла aliases. Команда make ленива и выполняет минимум рабо­ты, необходимый для получения результата. Она принимает решения на основе меток времени в файлах.

Вот еще один пример кода в файле Makefile:

filel.output: filel.input

commancH file.output

file2,output: file2,input command2 file2.input >$@

В первом случае команда, которую следует выполнить, использует стан­дартные потоки ввода/вывода stdin и stdout (перенаправление обозначе­но символами < и >), чтобы прочитать fileXnput и произвести запись в file, output. Второй фрагмент аналогичен первому, но команда берет имя входного из командной строки и перенаправляет вывод... куда? Конст­рукция $§ означает «файл, создаваемый этой инструкцией», в нашем случае это file2.output. Почему не придумали мнемоническое обозначе­ние, вроде $те или $this? Неизвестно. Вам совсем не обязательно исполь­зовать обозначение $@, но с ним вы будете выглядеть умнее своих коллег.

Команда make, запущенная без параметров, выполняет первую инст­рукцию из файла Makefile. По традиции первая инструкция называет­ся all, и она выполняет все инструкции, которые должны быть выпол­нены по умолчанию. Таким образом, запуск make выполняет все важ­ные инструкции. Возможно, это будут не все инструкции, а лишь те, которые вы хотите выполнить по умолчанию. Эта инструкция может выглядеть, например, так:

all: aliases.db access,db

Команда make без параметров проверяет, не обновлялись ли файлы ali- ases.db и access.db. Поскольку в инструкции all не указано никакой команды, файл с именем all создан не будет. Тогда make будет считать, что файл all устарел («не существует» эквивалентно «устарел»). Вско­ре вы поймете важность такой интерпретации.

Не будем забывать, что команда make ленива. Если файл access.db ус­тарел, а второй файл - нет, то она выполнит только действия по обнов­лению access.db. Если для обновления файла потребуются какие-то до­полнительные действия, а для них что-то еще, то команда make рацио­нально выполнит только необходимый минимум работы.

Кроме инструкции all, я обычно пишу еще пару-тройку полезных ко­манд:

reload:

postfix reload

stop:

postfix stop

start:

postfix start

Обсудим, что они означают. Если я введу make reload, команда make за­метит отсутствие файла reload и запустит команду postfix reload в надежде, что та создаст такой файл. Ага! Я ее перехитрил! Указанная команда перегружает конфигурацию Postfix. Она не создает никакого файла reload! Когда я выполню make reload в следующий раз, команда make поступит точно так же. Другими словами, если вы хотите, чтобы некоторое действие выполнялось всегда, сделайте так, чтобы инструк­ция не создавала файл, который надеется создать команда make.

Имея код, приведенный выше, я могу перезагрузить, остановить и за­пустить postfix, введя команду make reload, make stop и make start соот­ветственно. Если есть другие процессы, которые требуется остановить (например, IMAP сервер, веб-клиент электронной почты и т. д.), я включу необходимые команды в инструкции. Мне не нужно запоми­нать эти команды.

Сейчас я должен признать, что раньше чуть-чуть передернул. Я ска­зал, что каждая инструкция начинается с имени файла, который нуж­но создать, затем идет двоеточие, а затем - список файлов, образую­щих главный. Так вот, команде make неизвестно, состоит ли в дейст­вительности создаваемый файл из перечисленных. У нее нет способа проверить это. Элементы, указанные после двоеточия, являются всего лишь параметрами, которые не должны быть устаревшими.

Приведу простой пример реального файла Makefile, который запуска­ет Postfix и содержит инструкции обновления индекса для файлов ali­ases и access. В начале файла вы заметите константы (NEMALJSES, FDR и т. д.), используемые далее в файле. Обратный слэш (\) в конце стро­ки кода служит для переноса длинных строк:

NEWALISES=/usr/sbin/newa liases PDIR=/etc/postfix

PQSTMAP=/u5r/local/postfix/sbin/post[tiap И Команды

all: $(PDlft)/aliases.pag ${POIR)/aliases,dir \

$(PDIR)/access.dir S(PDIR)/access.pag reload

reload:

postfix reload

stop:

postfix stop

start:

postfix start

#

  • Когда aliases изменится, сгенерировать файлы ,pag and dir



S(PDIR)/aliases,pag $(PDIH)/aliases,dir: S(PDIR)/aliases $(NEWALIASES)

tf

tt Когда access изменится, сгенерировать файлы ,pag and ,dir i

$(POIFi)/access.dir $(PDIR)/access. pag: t(POIR)/access $(P0STHAP) I(PDIR)/access

Теперь я могу отредактировать файл aliases или access и ввести коман­ду make. Мне не нужно помнить, что команды обновления индексов сильно различаются. Я не должен помнить о необходимости переза­гружать конфигурацию Postfix, потому что соответствующая команда включена в инструкцию all. Конструкция reload в конце all будет ка­ждый раз запускать эту инструкцию.

С помощью команды make можно также поддерживать свежие версии файлов на разных серверах. Предположим, что на обоих наших почто­вых серверах файлы aliases должны быть одинаковыми. Мы решаем отредактировать файл на одном сервере и скопировать его на сервер server2. Инструкция может выглядеть, например, так:

push,aliases.done: $(PDIR)/aliases

scp $(PDIR)/aliases server2:$(PDIR)/aliases touch

Мы копируем файл на served командой scp, затем применяем команду touch к файлу push.aliases.done. Поскольку этот файл создается после успешной операции копирования, мы можем построить инструкции так, что копирование будет выполняться только в случае необходимо­сти. Мы также можем принудительно скопировать файл, если просто удалим push.aliases.done и введем команду make. Традиционно вводит­ся инструкция clean, которая удаляет все файлы *.done и прочие фай­лы, сгенерированные автоматически.

В файлах, имена которых оканчиваются на .done, нет ничего особенно­го. Это обычные файлы с меткой времени или флагом для имени.

Рассмотрим развернутый пример. Имеются два файла, подлежащие индексации после редактирования: aliases и access. Если хотя бы один из них проиндексирован заново, выдается команда перезагрузки Post­fix. Кроме того, оба файла копируются на served, если они были изме­нены. Наконец, команда cd /etc && make выполняется на server2 тогда и только тогда, когда на него был скопирован хотя бы один файл.

Будьте внимательны, создавая инструкции. Правильно указывайте параметры и применяйте команду touch к файлам *.done, если потребу­ется. Команда make выполнит лишь минимум работы, необходимый

для обновления системы. #

  • Makefile для serverl it

NEWAUSES=/usr/sbin/newaliase$ PDIR=/etc/postfix

P0STMAP=/usr/local/postfix/5bin/po5tmap :#

О "Команды" высокого уровня



all: aliases,done access.done reload_if_needed,done push

push: push,done

reload:

postfix reload

stop:

postfix stop

start:

postfix start

rsload_if.needed.done: aliases.done access.done postfix reload touch reload„if_needed.done

clean:

rm -f \

$(PDIR)/aliases.pag $(PDIR)/aliases,dir \ $(PDIR)/access.dir $(PDIR)/access.pag \

push.aliases.done push.access.done \ reload_if.needed.done

s

в Инструкции для конкретных файлов,

s которым требуется индексация/регенерация |

  • Если aliases изменится, сгенерировать файлы .рад and .dir

aliases,done: t(PDIR)/aliases.pag J(POIR)/aHases.dir

$(POIR)/aliases рад $(PDIR)/aliases,dir: $(PDIfi)/aliases ${NEWALIASES)

я Если access изменится, сгенерировать файлы ,pag and .dir

access.done: $(PDIR)/access,dir $(PDIR)/access.pag

$(PDIR)/access.dir $(POIR)/access.pag: $(PDIR)/access $(P0STMAP) J(PDIR)/access



# Копирование i

push.done: push,aliases.done push.access.done ssh server2 "cd /etc && make" touch

push.aliases.done: aliases.done

scp $(PDIR)/aliases server2:$(PDIR)/aliases touch

push.access.done: access.done

scp $(PDIR)/access server2:$(PDIR)/access touch S@

Этот Makefile является для вас хорошей стартовой площадкой. Он до­вольно сложен, потому что нам нужна гарантия того, что Postfix пере­загрузится, лишь когда это абсолютно необходимо.

Такой Makefile избавляет вас от необходимости помнить множество команд, в том числе те, которые необходимы для обновления конкрет­ных файлов. Вы больше не боитесь забыть какую-то команду. Многие сложные процедуры теперь сводятся к двум шагам:

    1. Отредактировать нужный файл.

    2. Ввести команду make.

Команда make является универсальным инструментом для соедине­ния нескольких автоматизированных процессов. Однажды я должен был объединить несколько процессов и процедур для трех больших се­тей. В каждой сети была своя система сопровождения псевдонимов, хостов и прочей административной информации. Разобравшись в про­цедурах для каждой сети, я построил Makefile для главных серверов этих сетей. Имена инструкций верхнего уровня были одинаковыми

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

В мои стратегические планы входило создание нового главного серве­ра, который в конечном счете заменил бы все серверы, доставшиеся мне, так сказать, в наследство. Первоначально Makefile нового главно­го сервера просто вызывал команду make на трех главных серверах с помощью команды rsh (это было задолго до появления ssh). Затем я поочередно перенес инструкции на новый сервер. Вначале я решил, что новый главный сервер должен быть единственным источником инфор­мации для файла aliases. Я слил файлы aliases всех трех сетей и раз­местил результат на главном сервере. Протестировав его, я создал ин­струкции, которые копировали этот объединенный файл на прежние главные серверы так, словно это был их собственный файл. Я поступил аналогичным образом с каждым файлом и каждой базой данных.

Поскольку каждое изменение было незначительным и конкретным, я мог выполнять тестирование итеративно. Произведя буквально не­сколько сотен изменений, я добился того, что все серверы «пели в уни­сон». В этот момент мне не составило труда исключить старые главные серверы и поставить новый над всеми клиентами.

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

Вот комментарий, который я пишу:

  • ЭТОТ ФАЙЛ СОПРОВОЖДАЕТСЯ НА СЕРВЕРЕ:

  • server1.example.com

Редактируйте его при помощи команды: xed file.txt

Если вы отредактируете его на любом другом компьютере,

Я он будет перезагружен. БУДЬТЕ ВНИМАТЕЛЬНЫ!



Поскольку в комментарии упоминается xed, я должен пояснить, что это такое. Есть несколько программ с именем xed, но эту конкретную программу можно найти по адресу http://www.nightcoder.com/code/ xed. Она вызывает редактор, которым вы обычно пользуетесь ($EDIIOR можно установить в vi, pico, emacs и т. д.), после того как заблокирует файл. Это обязательное условие для любого сайта, на котором один компьютер используют несколько системных администраторов. Если вы отслеживаете изменения в файле с помощью RCS, эта система заре­гистрирует все попытки отредактировать файл. Вы получаете практи­чески бесконечный откат и журнал, где записано, кто и что изменил. Если вы заметите, что последний месяц система ведет себя как-то странно, то проверьте, кто редактировал файл месяц назад. Будьте снисходительны: все мы допускаем ошибки.
Сложные задачи, выполняемые однократно

Автоматизация работы предполагает, что, выполняя нечто сложное, мы записываем последовательность действий. В этом случае повто­рить действия впоследствии много проще. Это как если бы мы строили для себя некоторую подстраховку.

Инкапсуляция сложной команды



Бывает, что на создание команды, которая делает именно то, что нужно, уходит несколько часов. Например, есть программа, создающая ISO-об- разы диска для последующей записи на CD-ROM. На странице ее описа­ния перечислены сотни параметров, но команда, позволяющая создать образ, читаемый в Windows, UNIX и Mac OS X, достаточно проста:

$ mklsofs -D -1 -J -L -f -P "Имя автора" -V "метка диска" -copyright \ copyright.txt disk.iso /directory/of/files

Конечно, все можно проделать с помощью графического интерфейса, но вы не получите никакого удовольствия (а также возможности соз­дать сценарий).

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

Она хорошо встраивается в JJAT-файл (в DOS) или в сценарий оболоч­ки UNIX/Linux.

Вот пример сценария makeimagel, в котором используется эта команда: ft! /Ып/bash

mkisofs -0 -1 -J -L -f -P "Limoncelli" -V 'date -u +MU $*

Конструкция 'date -u ' создает метку тома, содержащую теку­

щую дату.

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

Конструкция $* в сценарии означает «любые элементы командной строки». Если вы введете:



Достарыңызбен бөлісу:
1   ...   12   13   14   15   16   17   18   19   20




©dereksiz.org 2024
әкімшілігінің қараңыз

    Басты бет