воскресенье, 4 марта 2018 г.

Что должен знать новичок для работы системным администратором Linux

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

Например при переходе с Debian-based дистрибутивов на RHEL-based может быть непривычно то, что cron пишет в отдельный лог /var/log/cron, а не в /var/log/syslog, а для определения версии дистрибутива вместо /etc/lsb-release используется файл /etc/redhat-release. Или например при переходе Ubuntu с системы инициализации Upstart на Systemd могут возникнуть некоторые сложности при управлении сервисами, хоть Ubuntu и сохранили обратную совместимость со скриптами Upstart.

Для администрирования сети необходимы базовые понятия работы сетей, как настраивается сетевое соединение в Linux, что такое модель OSI, как работает IP-адресация,в чем отличия протоколов TCP, UDP, ICMP и прочих,как работают утилиты ping, traceroute, как устроен интернет, что такое динамическая маршрутизация и для чего нужен DNS.

Для того чтобы вовремя реагировать на инциденты, возникающие в серверной инфраструктуре необходимо иметь систему мониторинга. Пример таких систем Cacti, Nagios, Munin, Zabbix и многие другие. Мониторинг позволит не только в кратчайшие сроки среагировать на возникшую проблему, но и хранить историю инцидентов, анализировать периодичность возникновения проблем, строить графики для более удобного восприятия человеком.

Для решения возникающих инцидентов необходимо обладать навыками траблшутинга.
В первую очередь важно уметь работать с логами, фильтровать нужную информацию из логов, для этого часто используются утилиты cat, tail, awk, cut, grep, sort, wc и прочие.
Пример подсчета количества ошибок в логе Nginx:
# awk '{print $9}' /var/log/nginx/access.log | grep "500" -c
66192

Также необходимо позаботиться о ротации логов, для уменьшения занятого пространства старыми логами.
Такие инструменты как lsof и strace помогут понять какие файлы и соединения использует работающий процесс, а также какие системные вызовы он совершает.
tcpdump, tshark, iperf, mitmproxy, nmap и прочие инструменты помогут для анализа работы сбоев в сети.

Системные администраторы делятся на два вида, те кто еще не делает резервные копии и те кто уже делает их. Резервные копии нужны для быстрого восстановления потерянной информации.
Два параметра RPO (Recovery Point Objective) и RTO (Recovery Time Objective) определяют время актуальности резервных копий и время необходимое на восстановление копий соответственно.
Необходимо понимать отличия полного резервного копирования, при котором каждый раз копируются все файлы, от дифференциального, и при котором копируются только измененные файлы, и инкрементального, при котором копируются только те файлы, которые изменились с последнего полного или добавочного резервного копирования.
Рекомендуется хранить резервные копии в нескольких местах, в той же стойке где работает сервер, в отдельной стойке от сервера и в другом ЦОДе.
Важно также проверять консистентность резервных копий, обычно для этого используют тестовые стенды.
Существует множество инструментов для создания резервных копий, среди которых можно выделить Bareos, duplicity, rsync. Множество системных администраторов используют свои инструменты в виде скриптов для созданий резервных копий на основе rsync, tar, gzip.

Администратор должен понимать что такое RAID, LVM и как они работают, даже если ему не приходится использовать подобное. Рано или поздно он скорее всего столкнется с RAID при работе с физическими серверами и важно понимать как он работает, так как при неверной конфигурации и замене диска в RAID-массиве возможна полная потеря данных. Также при работе с физическими серверами будет полезно понимание работы IPMI, IP KVM.

Системный администратор должен знать хотя бы один из скриптовых языков программирования (Shell/BASH, Python, Perl, Ruby). Хороший системный администратор не делает одни и те же вещи больше трех раз, скорее всего он уже автоматизировал рутинную работу скриптом.

Отличное знание повседневных инструментов системного администратора значительно упрощает жизнь, единожды настроив конфигурационный файл текстового редактора vim и выучив все внутренние команды текстового редактора позволяет ускорить работу в значительной степени. Использование алиасов, для часто повторяющихся команд, например git add, git commit можно легко заменить на ga и gc.

При управлении парком серверов значительно упрощают жизнь системы управления конфигурациями, такие как Chef, Ansible, SaltStack, Puppet и другие.
Подобные системы позволяют централизованно управлять конфигурациями операционных систем и сервисов установленных на разных серверах. Для этого используются различные конфигурационные файлы именуемые в Puppet cookbook, в Chef — рецептами, а Ansible — playbook. Как правило, подобные конфигурационные файлы представляют собой список команд описанных в синтаксисе YAML или на прочих декларативных языках.
Большое количество модулей позволяет управлять практически любым процессом на сервере, а некоторые системы, такие как Ansible, позволяют управлять удаленными серверами без запуска агентов, исключительно с использованием SSH-соединения.

Для хранения данных приложений используются различные системы управления базами данных. Важно понимать, в чем состоит отличие MySQL от его форков MariaDB и Percona Server. Когда стоит использовать для проекта MySQL, а когда PostgreSQL. Чем отличаются реляционные базы данных от документо-ориентированных (MongoDB, CouchDB), key-value хранилищ (Redis, MemcacheDB) и прочих. Базовые знания SQL-запросов также не помешают.

Рано или поздно системный администратор сталкивается с протоколом LDAP (Lightweight Directory Access Protocol). LDAP  используется для централизованного хранения данных о пользователях, таким образом возможно синхронизировать все сервера для поиска информации о пользователях из единого каталога LDAP.

Системному администратору хостинга необходимо понимание работы веб-серверов (Apache, Nginx), режимах работы PHP, оптимизации работы MySQL, дебаге работы скриптов. Также стоит узнать как устроены современные панели управления хостингом (Cpanel, Plesk, Webmin и прочие).

Виртуализация в последние годы все больше и больше используется на серверах. Администратор должен понимать различия в системах виртуализации, чем отличается эмуляция оборудования (QEMU) от полной виртуализации (KVM, Hyper-V), паравиртуализации (Xen) и контейнерной виртуализации (LXC, OpenVZ).

Системный администратор должен обезопасить свою серверную инфраструктуру, для этого необходимо знание системных инструментов обеспечения безопасности (SELinux, AppArmor), фаерволов (Iptables, firewalld, ufw), необходимо отключить, или удалить неиспользуемые сервисы и настроить фаерволл так, чтобы доступ в интернет был только у нужных портов. Необходимо проводить периодические пентестинги для проверки уязвимостей в инфраструктуре, обезопаситься от атак на отказ. Желательно отказаться от паролей в пользу ключей, так как при современных мощностях подобрать пароль к системе стало значительно легче, в случае с ключем подбор займет много лет.

Также важно уметь документировать сетевую и серверную инфраструктуру, проводить периодическую инвентаризацию, вести учет событий. Желательно использовать системы управления проектами, такие как Redmine или Jira, это упростит взаимодействие с пользователями и позволит хранить список задач в структурированном виде.

Немаловажно для системного администратора следить за собственным временем и не перетруждаться, для этого необходимо правильно выбрать средства получения уведомлений, как не отвлекаться на мелкие инциденты и прочее. В книге «Тайм-менеджмент для системных администраторов» Томаса Лимончелли (ISBN 5-93286-090-1) описаны все эти моменты, рекомендуется к прочтению каждому системному администратору.

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

2 комментария:

Settled комментирует...

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

Amet Umerov комментирует...

Спасибо.
Все верно, ладить с начальством нужно уметь.