Лайфхаки для DevOps
У всех нас есть лайфхаки и инструменты, ускоряющие работу с определенными задачами и системами. У девопсов и администраторов облаков таких инструментов должно быть едва ли не больше всех, потому что сервисов, с которыми работать, — много, а терминал один. В этой статье я делюсь своим опытом работы с облачными системами и решением мелких задач, которые возникают каждый день.
ZSH
Начнем с самого часто используемого инструмента — интерпретатора командной строки. Я использую zsh — из‑за плагинов, тем и возможностей автодополнения. Автодополнение из истории сильно сокращает время набора команд, а плагины еще больше расширяют автодополнение, обеспечивают подсветку синтаксиса, добавляют полезные алиасы.
Два наиболее полезных плагина:
- git — отображает ветки/коммиты/репозитории. Наглядно видно, в каком репозитории находишься, инициализирован ли он, какая ветка, коммит, синхронизировано ли с удаленным репозиторием и прочее;
- zsh-syntax-highlighting — подсветка синтаксиса в консоли. Удобно при написании и отладке скриптов.
Подсветка веток в Git:
Также рекомендую установить плагины для каждодневно используемых инструментов: AWS, Docker, brew, knife, node, encode64, kubectl, osx, Python, pip. Практически все добавляют подсказки по табу, что уже очень полезно, некоторые по этому же табу стучатся в API сервисов и предлагают расширенное автодополнение, а не только возможные команды.
Плагины AWS и kubectl делают еще одну важную вещь — всегда показывают контекст/профиль, в котором работаешь, и сильно снижают шансы ошибиться и вкинуть какую‑нибудь опасную команду не в тот терминал. Плюс, к примеру, расширение для амазона умеет считывать назначенные профилям цвета, и, если будешь работать в проде, можно подкрасить профиль ярко‑красным, чтобы точно понимать, где выполняется команда.
Подсветка профиля AWSПодсветка профиля AWS:
Подсветка профиля kubectlПодсветка профиля kubectl:
Хорошая тема: powerlevel10k, гибкая, красивая, информативная, можно настроить по вкусу очень много вещей. Особенно удобен сквош исполненных команд после выполнения, чтобы не засорять экран.
Плагины, как и темы, установить довольно просто. Если заморачиваться — для этого есть плагин/пакет‑менеджеры для zsh вроде antigen или Zinit. Но в целом установка сводится к git clone и запуску скрипта, который сам все настроит. Для поиска плагинов лучше всего использовать подборки на GitHub вроде awesome-zsh-plugins.
SCREEN И TMUX
Screen — это эмулятор (а точнее, мультиплексор) терминальных сессий VT100. Но обычно его используют как способ безопасно выполнить команды через SSH на случай прерывания соединения.
К примеру, ты запускаешь «долгоиграющую» команду вроде apt-get upgrade и в этот момент соединение с сервером обрывается. В итоге дочерний процесс apt-get-сессии SSH умирает и процесс обновления пакетов останавливается. Чтобы этого не произошло, просто запусти screen и уже в нем запускай все нужные команды. Теперь, если соединение оборвется, родительский процесс screen останется жив и не только позволит команде корректно завершиться, но и позволит заново подключиться к существующей сессии, причем неважно, с какого устройства.
Screen позволяет запускать множество терминалов в рамках одной SSH-сессии:
У 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'