Как DevOps'ам изучать Shell-скриптинг?

Действительно хорошие и целеустремлённые DevOps-инженеры обязаны уметь писать скрипты как минимум на sh/bash. По крайней мере стремиться освоить этот навык.

Эта статья представляет из себя краткое руководство (с рядом рекомендаций, и ссылок на полезные ресурсы), которое как поможет вам решать ежедневные задачи, так и поможет давать более корректные ответы на собеседовании.

Никогда не лишним будет заметить, что в любом обучающем процессе, особенно когда дело касается самообучения, очень важно иметь терпение и обладать должной самодисциплиной, чтобы не бросить на полпути.
Это руководство именно для тех, кто хотел бы разобраться в фундаментальных процессах. Для тех кому нужно решать задачи "по-быстрому" здесь и сейчас - есть stackoverflow и google.

1.Shell-скриптинг для DevOps

Первый вопрос, которым вы возможно задаётесь. А насколько действительно важен этот навык для DevOps-инженера? Этот вопрос абсолютно нормальный как в среде новичков, так и матёрых специалистов (да-да, такое тоже встречается).

Ответ прост: Да, это важно.
Картинка ниже хорошо иллюстрирует исследование stackoverflow, где 27% респондентов ответили, что пишут на shell.

Как DevOps'ам изучать Shell-скриптинг? IT, Linux, Полезное, Программирование, Shell, DevOps, Длиннопост

Тут в догонку может прилететь второй вопрос.
Но у нас же полно различных средств автоматизации на любой вкус и под совершенно разные задачи? Может Shell всё таки того? Не нужен?
Ответ аналогичный первому: Shell всё еще жив, и всё еще очень нужен.
Да, может сейчас и не очень нужно создавать огромные портянки сценариев оболочки для автоматизации всего и вся, но для специальных задач для использования с инструментами автоматизации нам всё еще нужен Shell.

Например, если вы используете AWS user data, то весьма велика вероятность, что внутри него вы будете использовать скрипты на Shell. Другой пример, для создания образов AMI с помощью packer вы в конечном итоге будете применять Shell для конфигурации AMI. Также умение писать на баше может пригодится и при работе с системами управления конфигурацией, с контейнерами, и с многими другими системами.

Кроме того, сценарий оболочки пригодится для повторяющихся задач разработки. Например, это может быть развертывание Vagrant VM с необходимым программным обеспечением или настройка самой среды разработки.

Что наиболее важно, практическое написание сценариев и программирование становятся обязательными на предварительных собеседованиях в рамках собеседований DevOps. Так что это еще одна важная причина, по которой вам следует изучать сценарии оболочки.

2. Как начать писать на Shell?

Предварительное условия для начала - иметь опыт работы с Linux(или Unix). Следовательно прежде всего нужно убедиться, что вы комфортно себя чувствуете в командной строке Linux, и умеете работать с командами из пакета coreutils.

Если мир Linux для вас пока чужд, то стоит какое-то время потренироваться в виртуальной среде. Например развернув у себя локально абсолютно любой Linux в VirtualBox. Либо, воспользовавшись предложениями облачных провайдеров. Важно выбрать для начала широкоиспользуемый дистрибутив (ubuntu, fedora), так будет проще найти людей в сети, которым можно задать вопросы, и обсудить всплывающие проблемы. Если интересно копнуть глубже, и разобраться во внутренностях системы, то можно попробовать "продвинутые" дистрибутивы типа Arch или Gentoo (для особо упорных LFS). Но что совершенно точно не нужно, так это брать в руки всякую маргинальщину вроде KaliLinux или AstraLinux (во первых они основаны на более популярном и широко используемом дистрибутиве, а во вторых не во всяком линуксовом сообществе вас встретят с распростёртыми объятиями при упоминании таких поделок).

Если вы считаете, что достаточно хорошо умеете работать с Linux, то тогда сделайте следующее.

Создайте репозиторий на Github, создайте в нём каталог для каждого изучаемого вами аспекта, и коммитьте туда все ваши рабочие скрипты. Не имеет значения, будет репозиторий открытый или закрытый (хотя открытый обязывает более ответственно подходить к наполнению).

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

3. Какие есть бесплатные ресурсы для изучения программирования на Shell?

Вам совершенно точно не нужно платить за какие-либо расширенные курсы по изучению Shell-скриптинга, хотя на рынке есть достаточно предложений самых разных курсов для инженеров DevOps. Курсы (если они качественные) - это не плохо, и если вам комфортно обучаться в таком формате, то пожалуйста. Однако программирование на Shell - это тот навык, который вполне можно освоить самостоятельно.

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

Ссылки на сайты с интерактивными туториалами, бесплатными курсами, и pdf материалами (так как все ресурсы на английском, то тут у нас всплывает побочный квест - оттачивание навыка чтения технических текстов).

  1. Linux Shell Scripting Tutorial [Web]

  2. Free interactive shell scripting tutorials [Web]

  3. Shell Scripting tutorial [Web]

  4. Bash Guide [web]

  5. Shell Scripting Free Course [Udemy]

  6. Advanced Bash Scripting Guide [PDF]

  7. Bash Academy [Web]

  8. Bash Notes for Professionals [PDF]

  9. Bash Reference manual [PDF]

  10. The Linux command line [PDF]

4.Применение навыков Shell-скриптинга на практике.

Предположим вы уже изучили все основные концепции программирование на Shell, возможно написали несколько солидных скриптов в обучающих целях. Следующий справедливый вопрос у вас возможно будет "Ну и где мне теперь это всё применять?"

В первую очередь имеет смысл посмотреть существующие проекты автоматизации в своей компании. Особенно если компания не маленькая, и не решается одна точечная задача, то весьма вероятно, что в проектах найдётся не мало мест, где применяется Shell-скриптинг.

Если в вашей компании нет таких проектов, и вы как раз хотите заняться чем-то подобным, но не знаете с чего начать, то например можете посмотреть Git-репозитории с наиболее популярными образами контейнеров для Docker (например контейнер с Nginx).

Как DevOps'ам изучать Shell-скриптинг? IT, Linux, Полезное, Программирование, Shell, DevOps, Длиннопост

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

Не стоит конечно зацикливаться только на скриптах из контейнеров, вы можете найти скрипты во множестве других репозиториях open-source комьюнити.

5. Некоторые примеры для тренировки

Ниже приведены сценарии, которые вы можете реализовать с помощью Shell. Не каждый из них может пригодиться в реальной жизни, но вот на собеседовании они могут встречаться довольно часто. Так что будет полезно потренироваться над решением этих задач.

  1. Найдите 10 самых больших файлов в системе, и перенаправьте вывод в файл.

  2. Напишите скрипт для безопасного извлечения накопителей.

  3. Напишите скрипт, отправляющий уведомление на почту.

  4. Напишите скрипт для мониторинга загрузки CPU, памяти и дисков. Перенаправьте вывод с собранными данными в виде таблицы в файл, и уведомление в stdout если один их них превышает определённый порог.

  5. Напишите сценарий для поиска созданных файлов и их размеров. Он должен принимать количество дней в качестве входных данных. Или формат от и до даты в качестве входных данных.

  6. Напишите сценарий для автоматизации процесса создания новых учетных записей пользователей на сервере Linux и настройки их разрешений и доступа по SSH.

  7. Напишите скрипт для создания списка пользователей, вошедших в систему по дате, и запишите его в выходной файл.

  8. Напишите скрипт для рекурсивного копирования файлов на удалённую машину.

  9. Напишите скрипт который отображает количество неудачных попыток входа в систему по IP-адресу

  10. Создайте скрипт, который анализирует системный журнал, и пересылает в выходной файл выборку событий по конкретной службе, с отметками времени (в человекочитаемом формате).

  11. Напишите скрипт, автоматизируйщий процесс архивирования системного журнала в каталог с резервными копиями, с последующей очисткой текущего журнала.

  12. Напишите сценарий, проверяющий доступность списка URL, и отправляющий уведомление на почту, если какой-то из них не доступен.

  13. Напишите скрипт для автоматизации процесса обновления нескольких серверов.

  14. Напишите функцию, которая находит и убивает все зомби процессы в системе (задание со звёздочкой)

Не забывайте использовать в скриптах изученные понятия:

  1. Переменные.

  2. Подстановка команд, назначение результата переменным.

  3. Использование cut, awk, и grep.

  4. Перенаправление stdin/stdout/stderr.

  5. Обработка условий с помощью if/elif/else.

  6. Работу с оператором выбора (switch).

  7. Циклы for/do-while)

  8. Коды завершения (exit codes)

6.Вопросы по навыкам написания сценариев на собеседовании DevOps инженера.

Вопросы инженерам разнятся от компании к компании.

Например некоторые компании будут просто заинтересованы в ваших базовых знаниях Linux и сценариев оболочки. Другие компании будут рассчитывать на высокий уровень знаний командной строки Linux и сценариев оболочки.

Ниже приведены несколько примеров вопросов на собеседовании инженера DevOps.

  1. Можете ли вы объяснить, как сценарии оболочки вписываются в более широкий рабочий процесс DevOps?

  2. Зачем нужны сценарии оболочки, если есть другие инструменты автоматизации?

  3. В решении каких задач вы предпочтете использовать Shell, а не Python/Golang?

  4. Как провести статический анализ скрипта Shell?

  5. Как вы можете гарантировать, что сценарий оболочки не содержит ошибок в CI/CD pipeline?

  6. Как вы будете обрабатывать ошибки и исключения в своих сценариях?

  7. Напишите простой скрипт, который принимает в качестве аргументов имена двух файлов, объединяет их и записывает вывод в третий.

  8. Найдите дублирующиеся строки в файле, и замените их другой строкой.

  9. Найдите все уникальные IP адреса в логе, и запишите их в отдельный файл

  10. Как бы вы отлаживали сценарий оболочки, который работает неправильно?

  11. Какая разница между циклами for и while?

7. Заключение

Разумеется этот пост не претендует на исчерпывающее рассмотрение темы (очень уж она большая, чтобы уместиться в один пост), но надеюсь, это краткое руководство по изучению сценариев Shell будет как минимум небесполезным для вас.

Неприятная ссылка на канал сообщества в телеграме

Лига Сисадминов

1.5K поста17.7K подписчиков

Добавить пост

Правила сообщества

Мы здесь рады любым постам связанным с рабочими буднями специалистов нашей сферы деятельности.