Контрольный список для DevOps и инженеров, обеспечивающих бесперебойную работу систем

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

Ниже — чек-лист, составленный опытными инженерами Aymen El Amri и Sahil Sharma. Список не является исчерпывающим, но в нем перечислены обязательные базовые технические навыки и некоторые полезные мысли. Можно использовать в качестве контрольного списка для оценки себя или кого-нибудь еще или для подготовки к собеседованиям DevOps / SRE.

  • Понимание культурных аспектов DevOps:
    • Кросс-функциональные команды.
    • Культура общения и глобальное мышление.
    • Контроль версий и ревизии.
    • Инфраструктура как код (IaC).
    • Автоматизация рутинных задач.
    • Настройка сервисов самообслуживания.
    • Автоматизированная сборка.
    • Непрерывная интеграция.
    • Непрерывная поставка.
    • Инкрементальное тестирование и разработка через тестирование.
    • Автоматизированное управление релизами.
    • Короткие циклы разработки и срок выхода на рынок.
    • Ключевые показатели эффективности.
    • Цикл обратной связи DevOps.
  • Знание *nix-систем и хорошее понимание того, как работают дистрибутивы Linux.
  • Любовь к консоли. У вас могут быть графические интерфейсы для управления серверами, но важно любить терминал, и не важно, в какой ситуации. Терминал быстрее, безопаснее и безобманный, с ним будет очень легко, как только вы его освоили.
  • Как получить информацию о процессоре или системе (cat /proc/version, cat /proc/cpuinfo, uptime и др.).
  • Как работает cron. Настройка расписаний на месяц, дни или время.
  • Как узнать, какую ОС вы используете на своем компьютере (cat /etc/lsb-release).
  • Знать разницу между различными ОС *nix.
  • Разница между шеллами: sh, dash, bash, ash, zsh...
  • Как установить и очистить переменные окружения? Экспорт переменной окружения происходит временно, как экспортировать переменные на постоянной основе?
  • Конфигурационные файлы оболочки: ~/.bashrc, .bash_profile, .environment. Как выполнить скрипт внутри текущей сессии (source)?
  • Знание vim, его конфигурации (.vimrc) и некоторых основных рекомендаций является обязательным.
  • Как осуществляется логирование в системах *nix, что такое уровни логирования и как работать с инструментами управления логированием (rsyslog, logstash, fluentd, logwatch, awslogs...).
  • Как работает своппинг. Что такое подкачка (swapon -s, /proc/sys/vm/swappiness, sysctl vm.swappiness...).
  • Как посмотреть и настроить конфигурацию сети в системе.
  • Как установить статический или динамический IP-адрес на машине с разными подсетями? (Подсказка: CIDR.)
  • Как посмотреть, установить или создать резервную копию настроек роутера?
  • Как работает DNS? Как настроить DNS-сервер (Bind, Unbound, PowerDNS, Dnsmasq...)? В чем разница между рекурсивным и авторитетным DNS? Как устранить неполадки DNS (nslookup, dig...).
  • Знакомство с типами записей DNS: A, AAAA, C, CNAME, TXT и др.
  • Как работает SSH, как выполнить отладку и как сгенерировать SSH-ключи для беспарольного входа на другие машины.
  • Как настроить веб-сервер (Apache, Nginx...).
  • В чем разница между Nginx и Apache? В каких случаях использовать Nginx? А когда Apache? Можно использовать оба из них в одном веб-приложении, когда и как?
  • Как настроить обратный прокси (Nginx...)?
  • Как настроить кеширующий сервер (Squid, Nginx...)?
  • Как настроить балансировщик нагрузки (HAproxy, Nginx...)?
  • Что такое подсистема инициализации? Знаете ли вы Systemd, Upstart, SysV?
  • Познакомьтесь с Systemd и разберитесь, как выполнять мониторинг служб и управлять ими с помощью таких команд, как systemctl и journalctl.
  • Сборка любого ПО из исходников (gcc, make и другие инструменты).
  • Как сжать или распаковать файл в разных форматах через терминал (в основном tar, tar.gz).
  • Как настроить брандмауэры (iptables по крайней мере, UFW): назначить правила, посмотреть список правил, настроить маршрутизацию, заблокировать протокол или порт.
  • Знание наиболее часто используемых номеров портов, на которых службы работают по умолчанию (например: SSH (22), Web (80), HTTP/S (443) и т. д.).
  • Умение выполнять отладку и мониторинг работы приложений на продакшен-серверах. Расположение к скриптовым языкам. Bash является обязательным (другие языки сценариев, такие как Python, Perl, тоже пригодятся).
  • Знать, как использовать хотя бы один из инструментов управления конфигурацией и удаленного выполнения (Ansible, Puppet, SaltStack, Chef...). Ваш выбор должен основываться следующих критериях: синтаксис, производительность, язык шаблонов, модель push или pull, архитектура, интеграция с другими инструментами, масштабируемость, доступность и др.
  • Уметь настраивать и использовать инструменты непрерывной интеграции и доставки, такие как Jenkins, Travis CI, Buildbot, GoCd. Пойдет на пользу опыт интеграции этих инструментов с другими инструментами (такими как Selenium, инструменты сборки, ПО для управления конфигурацией, Docker, SDK провайдеров облачных вычислений и т. д.).
  • Знать распределенную систему управления версиями Git и ее основные команды (pull, push, commit, clone, branch, merge, logs... и т. д.). Понимать рабочие процессы с git. Знаете ли вы, как откатить репозиторий Git к предыдущему коммиту?
  • Как пользоваться SSH-ключами? Попробуйте настроить беспарольный доступ к репозиторию или учетной записи в Github, Bitbucket или Gitlab.
  • Знакомство с такими инструментами, как Vagrant, которые помогают создавать распространяемые и переносимые среды разработки.
  • Начните изучение инфраструктуры как кода и инструментов для автоматизации инициализации кода и инфраструктуры, такие как Terraform и Packer.
  • Начните изучение контейнеров и Docker. Базовая архитектура (cgroups и пространства имен). Как устроен Docker?
  • Начните знакомство с основными командами Docker (logs, inspect, top, ps, rm). Также загляните в Docker Hub (push/ pull для образов).
  • Начните изучать инструменты для оркестрирования контейнеров: Docker Swarm, Kubernetes, Mesosphere DC / OS, AWS ECS.
  • Углубитесь в БД (MySQL или любую другую, которая вам нравится).
  • Узнайте о Redis / Memcache и подобных инструментах
  • Какая у вас стратегия резервного копирования? Как проверить, надежный ли бэкап?
  • Знаете ли вы ext4, NTFS, fat? Знаете ли вы объединенные файловые системы?
  • Развивайте навыки облачных вычислений. Начните с выбора провайдера облачной инфраструктуры: Amazon Web Services, Google Cloud Platform, DigitalOcean, Microsoft Azure. Или создайте свое собственное частное облако с помощью OpenStack.
  • Как насчет промежуточного сервера? Какова ваша стратегия тестирования модульного тестрования? Сквозного тестирования? Вам действительно нужны промежуточные серверы? Погуглите «staging servers must die».
  • Почитайте о PaaS, IaaS, SaaS, CaaS, FaaS, DaaS и об архитектуре без серверов.
  • Знайте, как использовать и настраивать облачные ресурсы из командной оболочки, используя шеллы облачных провайдеров, или из ваших программ, использующих SDK облачных провайдеров.
  • Знание модели OSI и спецификаций модели TCP/IP? В чем разница между TCP и UDP? Вы знаете vxlan?
  • Освойте полезные команды, такие как команды мониторинга процессов (ps, top,htop, atop...), команды для проверки производительности системы (nmon, iostat, sar, vmstat...) и устранения неполадок и анализа сети (nmap, tcpdump, ping, traceroute,airmon, airodump...).
  • Познакомьтесь с кодами ответов HTTP (2xx, 3xx, 4xx, 5xx).
  • Вы знакомы с IDE (Sublime Text, Atom, Eclipse...)?
  • Анализ сетевых пакетов: tcpdump, Wireshark.
  • Что именно происходит, когда вы набираете google.com в браузере? От кеша браузера, локального кеша DNS, конфигурации локальной сети (файл hosts), маршрутизации, DNS, сети, веб-протоколов, систем кеширования на веб-серверах.
  • Познакомьтесь с беспорядочными версиями ядра и тем, как их исправлять.
  • Знать, как работает SSL/TLS и цифровые сертификаты (https).
  • Знакомство с протоколам безопасности: TLS, STARTTLS, SSL, HTTPS, SCP, SSH, SFTP, FTPS.
  • Знать разницу между PPTP, OpenVPN, L2TP/IPSec.
  • Как сгенерировать контрольные суммы (md5, SHA...) для проверки целостности любого файла.
  • Понимание разницы между монолитной и микросервисной архитектурами.
  • Познакомьтесь с преимуществами и недостатками микросервисной архитектуры и начните создавать аналогичные архитектуры.
  • Знаете ли вы, что такое ChatOps? Вы пробовали работать с одной из известных платформ? Hubot, Lita, Cog ?
  • Как развернуть проект с нулевым дайунтаймомо? Как вы бы сделали откат, запустили самовосстановление, автоматическое масштабирование?
  • Познакомьтесь с API и сервисами: RESTfull, RESTful-подобными, API-шлюзами, лямбда-функциями, бессерверными вычислениями, SOA, SOAP, JMS, CRUD.
  • Почитайте о приложениях, сохраняющих и не сохраняющих состояние (statefull, stateless).
  • Прочитайте глоссарий DevOps.
  • Как обеспечить безопасность инфраструктуры, сети и работающих приложений?
  • Знайте, как установить, настроить и использовать системы мониторинга (Nagios, Zabix, Sensu, prometheus...).
  • Прочтите об Open Source и о том, как вможно внести свой вклад в проекты с открытым исходным кодом.
  • Вы должны быть в состоянии вмешаться внутрь системы, если что-то плохое случится. Составьте подробную документацию о том, что пошло не так и как можно предотвратить повторение этого в дальнейшем.
  • Попробуйте способ решения проблемы, предложенный на StackOverflow. Всегда помните, что основы не меняются — меняются технологии.
  • Активно используйте Google, StackOverflow, Quora и другие профессиональные ресурсы.
  • Попытайтесь прийти к хорошим практикам разработки и надежной архитектуре.
  • Узнайте, как выполнять масштабирование на продакшен-уровне.
  • Наблюдайте за проектами с открытым исходным кодом (Kubernetes/Docker и т. д.) Или за тем, что вас интересует.
  • Задавайте вопросы, критикуйте, участвуйте в списках рассылок, форумах, технических конференция.
  • Наблюдайте за единомышленниками из сообщества и будьте в курсе последних технологических тенденций.
  • Следите за блогами уважаемых технологических компаний (Google, Uber, Quora, GitHub, Netflix). Это места, где вы можете учиться прямо у экспертов и получить возможность увидеть их подход к решению любой проблемы.
  • Просмотрите несколько агрегаторов, таких как Reddit, HackerNews, Medium и т. д.
  • Наблюдайте за единомышленниками и технологическими компаниями в Twitter.
  • Читайте блоги о технологиях и подписывайтесь на рассылки новостей на тему DevOps.
  • По возможности посещайте местные встречи и конференции. Вы получите возможность многому научиться у опытных специалистов.
  • Узнайте о масштабируемости и распределенных системах. Как обеспечить их отказоустойчивость?
  • Читайте книги.

Список принадлежит Aymen El Amri и Sahil Sharma. Перевод — Евгений Зятев.