- PVSM.RU - https://www.pvsm.ru -
В чем заключается основная задача системного администратора? Если выразить ее очень кратко, одним предложением? Еще лучше, одним словом?
Автоматизация.
Автоматизация бывает разных видов — управление пользователями и политиками (Active Directory), управление конфигурацией (Puppet) итд. Для автоматизации каких-то регулярных действий как в Windows, так и в Linux/Unix есть встроенные планировщики задач. Наверняка каждый администратор использует их ежедневно. Это же так удобно — написал скрипт, закинул в cron и забыл о нем.
Проблема в том, что забыть не получается.
Сколько я ни писал скриптов за свою жизнь (немало, скажем так), они были недостаточно совершенны. Время от времени какой-нибудь скрипт ломался по причине, которой я никак не ожидал. И я об этом даже не знал. Конечно, я боролся с этим — узнал про опцию "-e" для bash, пытался обрабатывать ошибки, сохранял логи выполнения, стал использовать строки вида "12 5 * * * /opt/scripts/backup.sh || mail -s 'backup error' my@email"
в кроне. В принципе, это даже работало. Для одного сервера. Двух. Трех. Пяти. А потом я задолбался. Даже если бы мои скрипты были идеальны, это просто жутко неудобно и долго — поддерживать кучу кронтабов на серверах, поддерживать скрипты в актуальной версии (для тех, которые использовались более чем на одном сервере), искать ошибки в логах в консоли. А если нужно запустить несколько скриптов на разных серверах в определенной последовательности? Из этого может получиться только какой-то жуткий костыль.
И что самое плохое, я все же не был до конца уверен, что все действительно работает как положено. Вдруг почтовый сервер был в дауне когда скрипт пытался отправить алерт? Вдруг скрипт подвис на какой-то команде? Вдруг еще что-то?
Похожая ситуация была с бэкапами. Как и, наверное, всякий Linux администратор, я начинал с простеньких shell-скриптов, потом потихоньку эволюционировал — rsync, rsnapshot, Amanda, Bacula. Одно время мне казалось, что Bacula — венец. Но нет, и на старуху случалась проруха. То какой-то client lock на 2 дня, то еще чем-то очередь забьет (а при одновременном запуске несколько backup job-ов путали тома итп.). Плюс неинтуитивная система управления/восстановления, так сразу не поймешь сколько бэкапов сохранено, за какие даты. Очень далеко ушло от KISS. В общем, опять же я не был полностью уверен в системе.
(Отступление: посколько я специализируюсь в Linux, то с коммерческими системами бэкапа не знаком. Возможно, там ситуация лучше. Но, в любом случае, не всем они достаются)
И вот однажды мне пришлось настроить билд-систему для разработчиков. Выбрали Jenkins CI. (Вообще-то тогда он еще был Hudson, но в силу некоторых обстоятельств в настоящий момент я рекомендую его форк — Jenkins). Самое обычное его применение, для чего он и был создан — скомпилировать код, выложить на тестовый сервер. Затем они захотели ежедневную синхронизацию базы продакшена с тестовой. Я подумал и добавил такой билд в Jenkins. Затем я заметил, что они часто просят создать им новую БД. Почему бы не создать билд, чтобы они сами могли это делать? Потом перенес туда же скрипты бэкапов. Дальше… пошло-поехало. Я нарадоваться не мог:
Одни плюсы, никаких минусов. Или есть минусы? Ну, вообще-то, есть:
Ни один из них не критичен, и, на мой взгляд, плюсы в абсолютном перевесе. Единственная проблема, которая у меня возникала с подключением slave — какой-то очень старый сервер с Redhat 7.3 имел соответственно очень старую версию JDK, на которой slave процесс просто не запускался. Честно говоря, не помню точно чем закончилось, но, кажется, я нашел-таки версию JDK, удовлетворявшую обе стороны.
Чтобы не быть голословным, приведу несколько real-life примеров использования:
В принципе, все что я говорил до этого, можно отнести к любому CI инструменту. Это не принципиально. Но если я кого-то убедил попробовать Jenkins и для уже использующих, обратите внимание:
"set +e; ...; set -e"
, а проверяйте код выхода — действительно ли он означает некритичную ошибку? (ну, это применяется к написанию скриптов вообще).script_name='test-script.sh' && svn export "$svn_url/$script_name" --username "$JENKINS_SVN_NAME" --password "$JENKINS_SVN_PASSWORD" --force && bash -xe -o pipefail "$script_name"
,$script_name
. Думаю, плюсы очевидны.Вот уже 2 года как пользователи дергают меня меньше, я сплю спокойней, а мои волосы стали мягкими и шелковистыми. Если серьезней, в настоящий момент я как администратор Linux с опытом более 5 лет считаю best practice использование инструмента CI для автоматизации любых повторяющихся задач, которые хоть сколько-нибудь критичны. Это необязательно должен быть Jenkins, есть и другие. Главное — забудьте про cron. Видеть статус всех задач на одной панели — это действительно удобно. CI tool vs cron — это примерно как Puppet vs ручная настройка. Разница качественная.
Автор: joneleth
Источник [3]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/avtomatizatsiya/22097
Ссылки в тексте:
[1] wiki.jenkins-ci.org/display/JENKINS/Monitor+and+Restart+Offline+Slaves: https://wiki.jenkins-ci.org/display/JENKINS/Monitor+and+Restart+Offline+Slaves
[2] wiki.jenkins-ci.org/display/JENKINS/Editing+or+Replacing+the+All+View: https://wiki.jenkins-ci.org/display/JENKINS/Editing+or+Replacing+the+All+View
[3] Источник: http://habrahabr.ru/post/161765/
Нажмите здесь для печати.