Полезные инструменты для DevOps

Полезные инструменты для DevOps


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

ZSH

Начнем с самого часто используемого инструмента — интерпретатора командной строки. Я использую zsh — из-за плагинов, тем и возможностей автодополнения. Автодополнение из истории сильно сокращает время набора команд, а плагины еще больше расширяют автодополнение, обеспечивают подсветку синтаксиса, добавляют полезные алиасы. Два наиболее полезных плагина:

- git — отображает ветки/коммиты/репозитории. Наглядно видно, в каком репозитории находишься, инициализирован ли он, какая ветка, коммит, синхронизировано ли с удаленным репозиторием и прочее;

- zsh-syntax-highlighting — подсветка синтаксиса в консоли. Удобно при написании и отладке скриптов.

Также рекомендую установить плагины для каждодневно используемых инструментов: AWS, Docker, brew, knife, node, encode64, kubectl, osx, Python, pip.

Практически все добавляют подсказки по табу, что уже очень полезно, некоторые по этому же табу стучатся в API сервисов и предлагают расширенное автодополнение, а не только возможные команды. Плагины AWS и kubectl делают еще одну важную вещь — всегда показывают контекст/профиль, в котором работаешь, и сильно снижают шансы ошибиться и вкинуть какую-нибудь опасную команду не в тот терминал. Плюс, к примеру, расширение для амазона умеет считывать назначенные профилям цвета, и, если будешь работать в проде, можно подкрасить профиль ярко-красным, чтобы точно понимать, где выполняется команда.

Хорошая тема: powerlevel10k, гибкая, красивая, информативная, можно настроить по вкусу очень много вещей. Особенно удобен сквош исполненных команд после выполнения, чтобы не засорять экран. Плагины, как и темы, установить довольно просто. Если заморачиваться — для этого есть плагин/пакет-менеджеры для zsh вроде antigen или Zinit. Но в целом установка сводится к git clone и запуску скрипта, который сам все настроит. Для поиска плагинов лучше всего использовать подборки на GitHub вроде awesome-zsh-plugin

SCREEN И TMUX

Screen — это эмулятор (а точнее, мультиплексор) терминальных сессий VT100. Но обычно его используют как способ безопасно выполнить команды через SSH на случай прерывания соединения.

К примеру, ты запускаешь «долгоиграющую» команду вроде apt-get upgrade и в этот момент соединение с сервером обрывается. В итоге дочерний процесс apt-get-сессии SSH умирает и процесс обновления пакетов останавливается. Чтобы этого не произошло, просто запусти screen и уже в нем запускай все нужные команды. Теперь, если соединение оборвется, родительский процесс screen останется жив и не только позволит команде корректно завершиться, но и позволит заново подключиться к существующей сессии, причем неважно, с какого устройства.

У Screen есть более современная альтернатива под названием tmux. Ее разработали парни из OpenBSD, и в целом она отличается более высокой производительностью и наличием различных современных плюшек, вроде поддержки плагинов. Сразу рекомендую установить плагин tmux-resurrect, позволяющий сохранить текущий набор открытых в tmux терминалов в файл и восстановить его, когда понадобится выполнить схожую задачу.

JQ

Взаимодействие с вебом и облачными инфраструктурами по большей части идет в формате JSON. Kubectl и многие другие инструменты также умеют выводить данные в JSON. Поэтому нам нужен JSON-процессор, и лучший из них — это jq. Очень удобный инструмент с развитым синтаксисом и достаточной гибкостью, чтобы писать сложные вложенные запросы и условия.

В man json можно найти полную документацию с хорошими примерами использования, да и в целом инструмент настолько популярен, что примеры есть практически для любой задачи. Далее несколько примеров работы с Kubernetes.

Посмотреть выставленные переменные окружения в контейнерах:

$ kubectl get pods --all-namespaces -o json | jq '.items[].spec. containers[].env[]?'

Поиск поврежденных деплойментов:

$ kubectl get --raw=/apis/apps/v1/deployments | jq '.items[] | {name: .metadata.name, replicas: .status.replicas, available: (.status.availableReplicas // 0), unavailable: (.status.unavailableReplicas // 0)} | select (.unavailable > 0)'

Быстро посмотреть, какие образы доступны на нодах (часто помогает при проблеме с кешированием и скачиванием образов новых версий):

$ kubectl get nodes -o json | jq '.items[] | .status .images[]'`

Схоже с предыдущей, вариант быстрого просмотра доступных ресурсов на нодах, удобно пользоваться в связке со скриптами:

$ kubectl get nodes -o json | jq '.items[] | .status .allocatable'

K9S И K8S LENS

K9S— консольный менеджер для Kubernetes. Легкий, быстрый, поддерживает все способы авторизации в кубере, включая SSO и aws-iam-auth. Позволяет быстро и наглядно перемещаться по кластеру, редактировать манифесты и ресурсы, заходить в контейнеры, смотреть загрузку ресурсов.

Из минусов — нет «вкладок», а соответственно, возврата к открытым ресурсам. Но в любом случае работать с кластером через K9S ощутимо удобнее, чем через kubectl, даже если написать для последнего много алиасов.

K8S lens — отдельное десктопное приложение (на самом деле написанное на электроне). Показывает кластер в еще более красивом виде. По возможностям примерно равен K9s. Из минусов — не все методы авторизации поддерживаются. Есть довольно большая библиотека плагинов.

VAGRANT

Vagrant — ощутимо потерявший в популярности, но все еще часто полезный инструмент управления виртуальными машинами. Основное достоинство Vagrant — удобная и легкая (в плане конфигурации) оркестрация виртуальных машин, позволяющая создавать универсальные тестовые среды для любых целей.

К примеру, чтобы настроить образы виртуальных машин на этапе сборки, я использую Ansible. Но каждый раз для тестовых прогонов подключаться к серверам, будь то облачные или локальные Hyper-V/VMware/QEMU, может быть проблематично, сложно и затратно по времени. Лучше написать простую конфигурацию для Vagrant, который по vagrant up будет прогонять запуск плейбука Ansible на локальном VirtualBox. Это намного быстрее и проще, чем с использованием удаленного сервера.

PACKER

Для итоговой сборки образов виртуальных машин я использую Packer. Это часть стека Hashicorp (тех же ребят, кто написал Vagrant), поэтому конфигурация для запуска Ansible схожа и очень легко переносится из Vagrant в Packer.

Так же как и в Vagrant, используя Ansible-provisioner, запускаем такую жеконфигурацию в процессе сборки AMI:

SUPERVISORD

В продакшене каждый контейнер должен быть ответственным за выполнение только одного процесса (это правило хорошего тона). Для тестов же часто, помимо основного процесса (например, бэкенда какого-то приложения), требуется запустить еще и реверс-прокси, базу или какой-то дополнительный процесс для мониторинга и тестов.

Как раз здесь и пригодится Supervisord. Он будет запускать и мониторить несколько процессов, а его конфиг проще, чем дополнительный докерфайл, и быстрее, чем сборка двух-трех образов. Разумеется, в продакшене такое лучше не использовать, так как это идет вразрез с основной концепцией докера.

Сам конфиг супервизора для тестирования работы прокси к бэкенду выглядит примерно так:

И сам докерфайл с точкой входа под супервизор:

ЛОГИНЫ И ПАРОЛИ

Возможно, ты уже используешь менеджеры паролей вроде LastPass, KeePass, 1Password или Dashlane. Может быть, в твоей организации они используются на корпоративном уровне. Но ты мог не знать, что у всех этих менеджеров есть чертовски удобные консольные версии.

С их помощью можно сделать врапперы для авторизации в облачных системах, быстро подставлять токены в curl или даже встроить это как сорс секретов в пайплайны вместо использования системы вроде Hashicorp Vault.

Короткий алиас, позволяющий получить по имени хранилища и ключу нужное значение. К примеру, op-value Engineering console-pass:

alias op-value=function(){op list items --vault $1 | jq --arg $2 -r '.[] | select(.overview.title | contains($v)) | .uuid'}

Быстрый просмотр и поиск нужного айтема, сразу можно копировать UUID, чтобы получить нужное значение:

alias op-list-items=function(){op list items --vault $1 | jq -r '.[] | .uuid, .overview.title' | less

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

ВЫВОДЫ

Для каждой задачи, рутинной или не очень, можно найти свое решение и внедрить его в повседневное использование. Так, плагины для zsh становятся ежедневными помощниками, Vagrant и Supervisord помогают экономить время на запусках тестов, а менеджеры паролей, несмотря на свою пользовательскую природу, отлично интегрируются в облачную инфраструктуру. Главное в любой рутинной задаче — чтобы в следующий раз ее можно было сделать быстрее.


Report Page