Тайм-менеджмент для системных администраторов - [78]

Шрифт
Интервал

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

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

>NEWALISES=/usr/sbin/newaliases

>PDIR=/etc/postfix

>POSTMAP=/usr/local/postfix/sbin/postmap

># Команды

>all: $(PDIR)/aliases.pag $(PDTR)/aliases.dir \

>$(PDIP)/access.dir $(PDIR)/access.pag reload

>reload:

>postfix reload

>stop:

>postfix stop

>start:

>postfix start

>#

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

>#

>$(PDIR)/aliases.pag $(PDIR)/aliases.dir: $(PDIR)/aliases $(NEWALIASES)

>#

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

>#

>$(PDIR)/access.dir $(PDIR)/access.pag: $(PDIR)/access $(POSTMAP) $(PDIR)/access

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

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

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

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

>touch $@

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

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

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

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

>#

># Makefile для server1

>#

>NEWALISES=/usr/sbin/newaliases

>PDIR=/etc/postfix

>POSTMAP=/usr/lосаl/postfix/sbin/postmap

>#

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

>#

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

>push: push.done

>reload:

>postfix reload

>stop:

>postfix stop

>start:

>postfix start

>reload_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

>#

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

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

>#

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

>aliases.done: $(PDIR)/aliases.pag $(PDIR)/aliases.dir

>$(PDIR)/aliases.pag $(PDIR)/aliases.dir: $(PDIR)/aliases $(NEWALIASES)

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

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

>$(PDIR)/access.dir $(PDIR)/access.pag: $(PDIR)/access $(POSTMAP) $(PDIR)/access

>#

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

>#

>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 $@

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

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

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

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

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