Я системный администратор FirstVDS, и это — текст первой вводной лекции из моего краткого курса помощи начинающим коллегам. Специалисты, которые недавно начали заниматься системным администрированием, сталкиваются с рядом одних и тех же проблем. Чтобы предложить решения, я взялся написать этот цикл лекций. Некоторые вещи в нём специфичны для технической поддержки хостинга, но в целом, могут оказаться полезными если не для всех, то для многих. Поэтому я адаптировал текст лекции, чтобы поделиться здесь.
Не имеет значения, как называется ваша должность — важно, что по факту вы занимаетесь администрированием. Поэтому начнем с того, чем должен заниматься системный администратор. Основная его задача — это приведение в порядок, поддержание порядка и подготовка к грядущим увеличениям порядка. Без системного администратора на сервере начинается бардак. Логи не пишутся, или в них пишется не то, ресурсы распределяются неоптимально, диск заполняется всевозможным мусором и система начинает медленно загибаться от такого количества хаоса. Спокойно! Системные администраторы в вашем лице приступают к решению проблем и устранению бардака!
Столпы системного администрирования
Однако прежде, чем приступать к решению проблем, стоит познакомиться с четырьмя основными столпами администрирования:
- Документацией
- Шаблонизацией
- Оптимизацией
- Автоматизацией
Это основа основ. Если не строить свой рабочий процесс на этих принципах, он будет неэффективным, непродуктивным и вообще мало похожим на настоящее администрирование. Давайте разберёмся с каждым отдельно.
Документация
Документация подразумевает под собой не чтение документации (хотя без этого никуда), но и ведение.
Как вести документацию:
- Столкнулись с новой проблемой, которую до этого не видели никогда? Запишите основные симптомы, способы диагностики и принципы устранения.
- Придумали новое элегантное решение типовой проблемы? Запишите его, чтобы вам не пришлось изобретать его заново через месяц.
- Вам помогли разобраться с вопросом, в котором вы ничего не понимали? Запишите основные тезисы и концепции, нарисуйте себе схему.
Основная идея: не стоит целиком доверяться собственной памяти при освоении и применении нового.
В каком формате вы это будете делать, зависит только от вас: это может быть система с заметками, личный блог, текстовый файл, физический блокнот. Главное, чтобы ваши записи отвечали следующим требованиям:
- Не быть излишне длинными. Выделяйте основные идеи, методы и средства. Если понимание проблемы требует нырнуть в низкоуровневую механику работы выделения памяти в Linux, не переписывайте статью, из которой вы ее узнали — дайте на нее ссылку.
- Записи должны быть понятными для вас. Если строчка race cond.lockup не позволяет вам сразу понять, что вы этой строчкой описали — поясните. В хорошей документации не надо разбираться по полчаса.
- Поиск — очень хорошая фишка. Если вы ведёте записи в блоге, добавляйте теги; если в физическом блокноте — приклеивайте маленькие post-it с описаниями. Нет особого смысла в документации, если вы на поиск ответа в ней тратите столько же времени, сколько потратили бы на решение вопроса с нуля.
Вот так может выглядеть документация: от примитивных записей в блокноте (картинка выше), до полноценной многопользовательской базы знаний с тегами, поиском и всеми возможными удобствами (ниже).
Вам не только не придётся искать одни и те же ответы дважды: документирование будет замечательным подспорьем в изучении новых тем (конспекты же!), прокачает ваше паучье чутьё (способность диагностировать сложную проблему, бросив один поверхностный взгляд), добавит организованности в ваши действия. Если документация будет доступна вашим коллегам, то позволит им разобраться, что и как вы там нагородили, когда вас не будет на месте.
Шаблонизация
Шаблонизация — это создание и использование шаблонов. Для решения большинства типовых вопросов стоит создать определённый шаблон действий. Для диагностики большинства проблем следует использовать стандартизированную последовательность действий. Когда вы что-то починили/установили/оптимизировали, работоспособность этого чего-то стоит проверять по стандартизированным чек-листам.
Шаблонизация — лучший способ организации рабочего процесса. Используя типовые процедуры для решения наиболее частых проблем, вы получаете много всего классного. Например, использование чек-листов позволит вам диагностировать все важные для работы функции и отбросить диагностику маловажной функциональности. А стандартизированные процедуры сведут к минимуму ненужные метания и снизят вероятность ошибки.
Первым важным моментом является то, что процедуры и чек-листы тоже нужно документировать. Если просто надеяться на память, можно пропустить какую-нибудь реально важную проверку или операцию и всё развалить. Второй важный момент — все шаблонные практики можно и нужно модифицировать, если этого требует ситуация. Идеальных и абсолютно универсальных шаблонов нет. Если проблема есть, а шаблонная проверка её не выявила — это не значит, что проблемы нет. Однако прежде, чем браться за проверку каких-то маловероятных гипотетических проблем, всегда стоит сперва сделать быструю шаблонную проверку.
Оптимизация
Оптимизация говорит сама за себя. Рабочий процесс нужно максимально оптимизировать в плане время- и трудозатрат. Тут вариантов бессчётное множество: выучите горячие клавиши, сокращения, регулярные выражения, доступные инструменты. Ищите варианты более практичного использования этих инструментов. Если вы 100 раз на дню вызываете команду, повесьте её на клавиатурное сокращение. Если вам нужно регулярно подключаться к одним и тем же серверам, запишите alias в одно слово, который будет вас туда подключать:
Ознакомьтесь с разными вариантами доступных инструментов — возможно, есть более удобный терминальный клиент, DE, менеджер буфера обмена, браузер, почтовый клиент, операционная система. Узнайте, какими инструментами пользуются ваши коллеги и знакомые — может, они выбирают их не просто так. После того, как вы подберете инструменты, научитесь их применять: выучите ключи, сокращения, tips and tricks.
Оптимально используйте стандартные инструменты — coreutils, vim, регулярные выражения, bash. Для последних трёх есть огромное количество замечательных мануалов и документация. С их помощью можно довольно быстро перейти от состояния «я чувствую себя обезьяной, которая колет орехи ноутбуком — до «я обезьяна, которая использует ноутбук, чтобы заказать себе орехокол».
Автоматизация
Автоматизация перенесет тяжёлые операции из наших уставших рук в неутомимые руки автоматики. Если какая-то стандартная процедура выполняется в пяток однотипных команд, то почему бы не обернуть все эти команды в один файлик и не звать одну команду, которая этот файлик качает и выполняет?
Собственно автоматизация на 80% состоит из написания и оптимизации своих собственных инструментов (и ещё на 20% из попыток заставить их работать как надо). Это может быть просто продвинутый однострочник или же огромная всемогущая тулза с веб-интерфейсом и API. Главный критерий здесь — создание инструмента должно занимать не больше времени и усилий, чем количество времени и усилий, которое вам этот инструмент сэкономит. Если вы пять часов пишете скрипт, который вам больше никогда не пригодится, для задачи, на решение которой у вас без скрипта ушел бы час-другой — это очень плохая оптимизация рабочего процесса. Можно потратить пять часов на создание инструмента, только если количество, тип задач и время это позволяют, что бывает нечасто.
Автоматизация необязательно подразумевает написание полноценных скриптов. Например, чтобы создать кучу однотипных объектов из списка, достаточно ловкого однострочника, который автоматом сделает то, что вы бы делали руками, переключаясь между окнами, с кучами копипаста.
Собственно, если построить процесс администрирования на этих четырёх столпах, то можно довольно быстро повысить свою эффективность, продуктивность и квалификацию. Однако этот список нужно дополнить ещё одним пунктом, без которого работа в IT практически невозможна — самообразованием.
Самообразование сисадмина
Чтобы быть в этой сфере хоть чуть-чуть компетентными, нужно постоянно учиться и узнавать новое. Если у вас нет ни малейшего желания сталкиваться с неизвестным и разбираться, вы очень быстро «просядете». В IT постоянно появляются всевозможные новые решения, технологии и методы, и если вы не изучаете их хотя бы поверхностно — вы на пути к проигрышу. Многие области информационных технологий стоят на весьма сложном и объёмном базисе. Например, работа сети. Сети и интернет есть везде, вы сталкиваетесь с ними ежедневно, но стоит копнуть в технологии, которые стоят за ними, вы обнаружите огромную и очень сложную дисциплину, изучение которой — ни разу не прогулка в парке.
Я не стал включать этот пункт в список, потому что он — ключевой для IT в общем, а не только для системного администрирования. Естественно, выучить абсолютно всё и сразу не получится — у вас просто физически не хватит времени. Поэтому при самообразовании следует помнить о необходимых уровнях абстракции.
Вам необязательно сразу учить, как работает внутренний менеджмент памяти у каждой отдельно взятой утилиты, и как он взаимодействует с менеджментом памяти Linux, но вот что оперативная память из себя представляет схематически, и зачем она нужна, знать неплохо. Вам необязательно знать, как структурно отличаются заголовки у TCP и UDP, но было бы неплохо понимать основные отличия протоколов в работе. Вам не нужно изучать, что из себя представляют затухания сигнала в оптике, но было бы неплохо знать, почему настоящие потери всегда наследуются по узлам. Нет ничего плохого в том, чтобы знать как работают определённые элементы на определённом уровне абстракции и необязательно разбирать абсолютно все уровни, когда абстракции нет вообще (вы просто свихнётесь).
Однако в своей области рассуждать на уровне абстракции «ну это такая штука, которая позволяет показывать сайтики» — не очень хорошо. Следующие лекции будут посвящены обзору основных областей, с которыми системному администратору приходится сталкиваться в работе на более низких уровнях абстракции. Я постараюсь ограничить количество обозреваемых знаний минимальным уровнем абстракции.
10 заповедей системного администрирования
Итак, мы усвоили четыре основных столпа и фундамент. Можно начинать решать проблемы? Ещё нет. Перед этим желательно ознакомиться с так называемыми «best practices» и правилами хорошего тона. Без них есть вероятность, что вы принесёте больше вреда, чем пользы. Итак, начнём:
Некоторые мои коллеги считают, что самое первое правило — «не навреди». Но я склонен не согласиться. Когда пытаешься не навредить, то и сделать ничего не можешь — слишком много действий потенциально деструктивны. Самым важным правилом я считаю — «сделай бэкап». Даже если навредишь, всегда можно будет откатиться, и всё будет уже не так плохо.
- Бэкапить нужно всегда, когда время и место позволяют это. Бэкапить нужно то, что вы будете менять и то, что вы рискуете потерять при потенциально деструктивном действии. Бэкап желательно проверить на целостность и наличие всех нужных данных. Бэкап не стоит удалять сразу после того, как вы всё проверили, если не требуется освободить место на диске. Если место требует — забэкапьте на ваш личный сервер и удаляйте через неделю.
- Второе по важности правило (которое я сам часто нарушаю) — «не скрывай». Если вы сделали бэкап, напишите — куда, чтобы вашим коллегам не приходилось его искать. Если вы сделали какие-то неочевидные или сложные действия, запишите: вы уйдёте домой, а проблема может повториться или возникнуть у кого-то другого и ваше решение найдут по ключевым словам. Даже если вы делаете что-то, что хорошо знаете, этого могут не знать ваши коллеги.
- Третье правило объяснять не надо: «никогда не делай того, последствия чего ты не знаешь, не представляешь или не понимаешь». Не копируй команды из интернета, если не знаешь, что они делают, позови man и распарси сначала. Не применяй готовые решения, если не можешь понять, что они делают. Сведи к абсолютному минимуму выполнение обфусцированного кода. Если времени разбираться нет — то вы что-то делаете не так и вам следует ознакомиться со следующим пунктом.
- «Тестируй». Новые скрипты, инструменты, однострочники и команды следует проверять в контролируемой среде, а не на клиентской машине, если там есть хотя бы минимальный потенциал к деструктивным действиям. Даже если вы всё забэкапили (а вы это сделали), даунтайм — не самое классное дело. Заведите для этого дела отдельный сервак/виртуалку/chroot и тестируйте там. Ничего не сломалось? Тогда можно запускать на «боевом».
- «Контролируй». Сведите к минимуму все операции, которые вы не контролируете. Одна кривая зависимость у пакета может утянуть за собой половину системы, а выставленный для yum remove флаг -y, даёт вам возможность потренировать свои навыки восстановления системы с нуля. Если у действия нет бесконтрольных альтернатив — следующий пункт и готовый бэкап.
- «Проверяй». Проверяйте последствия своих действий и нужно ли откатиться на бэкап. Проверяйте, действительно ли проблема решилась. Проверяйте, воспроизводится ли ошибка и при каких условиях. Проверяйте, что вы можете разломать своими действиями. Доверять в нашей работе — лишнее, а вот проверять — никогда.
- «Общайся». Если не удаётся решить проблему, спросите у коллег, не сталкивались ли они с таким. Хотите применить спорное решение — узнайте мнение коллег. Возможно они предложат решение лучше. Нет уверенности в своих действиях — обсудите их с коллегами. Даже если это ваша экспертная область, свежий взгляд на ситуацию может многое прояснить. Не стесняйтесь собственного незнания. Лучше задать глупый вопрос, показаться дураком и получить на него ответ, чем не задавать этот вопрос, не получить ответ и остаться в дураках.
- «Не отказывай в помощи безосновательно». Этот пункт — обратная сторона предыдущего. Если вам задали глупый вопрос — проясните и объясните. Просят невыполнимого — объясните, что оно невыполнимо и почему, предлагайте альтернативы. Если нет времени (реально нет времени, а не желания) — скажите, что у вас есть срочный вопрос\большой объём работы, но вы разберётесь попозже. Если у коллег нет срочных задач, предложите обратиться к ним и делегируйте вопрос.
- «Давай фидбэк». Кто-то из коллег начал применять новую методику или новый скрипт, а вы встречаетесь с негативными последствиями этого решения? Сообщите об этом. Возможно, проблема решается в три строчки кода или пять минут доработки методики. Наткнулись на баг в ПО? Сообщите о баге. Если он воспроизводится или его нет необходимости воспроизводить, его, скорее всего, пофиксят. Озвучивайте пожелания, предложения и конструктивную критику, выносите вопросы на обсуждение, если кажется, что они актуальны.
- «Проси фидбэка». Мы все неидеальны, как и наши решения, а лучший способ проверить правильность своего решения — вынести его на обсуждение. Заоптимизировали что-то у клиента — попросите проследить за работой, может «бутылочное горлышко» у системы не там, где вы искали. Написали скриптик-помогайку — покажите коллегам, может они найдут способ его улучшить.
Если постоянно применять эти практики в работе, большая часть проблем перестает быть проблемами: вы не просто сведёте количество своих собственных ошибок и факапов к минимуму, но и будете иметь возможности исправить ошибки (в лице бэкапов и коллег, которые вам посоветуют забэкапить). Дальше — только технические детали, в которых, как известно, и кроется дьявол.
Основные инструменты, с которыми вам придётся работать больше 50% времени — grep и vim. Что может быть проще? Поиск по тексту и редактирование текста. Однако и grep, и vim — мощнейшие многофункциональные мультитулы, которые позволяют искать и редактировать текст эффективно. Если какой-нибудь виндовый notepad позволит вам просто написать/удалить строчку, то в vim’е можно делать с текстом почти что угодно. Не верите — вызовите из терминала команду vimtutor и начинайте учить. Что же касается grep — основная его сила в регулярных выражениях. Да, сам инструмент позволяет довольно гибко задавать условия поиска и выводимые данные, но без RegExp это особого смысла не имеет. И регулярные выражения знать нужно! Хотя бы на базовом уровне. Для начала я бы посоветовал вам посмотреть вот это видео, в нём разбираются основы основ регулярных выражений и их применения совместно с grep. Ах да, при совмещении их с vim, вы получаете ULTIMATE POWER возможность делать с текстом такие вещи, что их приходится обвешивать значками 18+.
Из оставшихся 50%, 40% приходятся на пакет инструментов coreutils. Для coreutils список вы можете посмотреть в википедии, а мануал ко всему списку — на сайте GNU. Что не покрыто этим набором, есть в утилитах POSIX. Необязательно заучивать это со всеми ключами наизусть, но хотя бы примерно знать, что могут основные инструменты — полезно. Не придётся изобретать велосипед из костылей. Мне как-то надо было заменить переносы строки на пробелы в выводе от какой-то утилиты, и больной мозг родил конструкцию вида sed ':a;N;$!ba;s/\n/ /g', подошедший коллега отогнал меня метлой от консоли, а потом решил задачу, написав tr '\n' ' '.
Я бы посоветовал запомнить, что примерно выполняет каждая отдельная тулза и ключики к самым часто используемым командам, для всего остального есть man. Не стесняйтесь звать man, если вы в чём-то сомневаетесь. И обязательно прочитайте man на сам man — он содержит важную информацию о том, что вы найдете.
Зная эти инструменты, вы сможете эффективно решить значительную часть задач, с которыми столкнетесь на практике. В следующих лекциях мы рассмотрим, когда применять эти инструменты и структуры основных служб и приложений, к которым они применяются.
С вами был системный администратор FirstVDS Кирилл Цветков.