0 added
0 removed
Original
2026-01-01
Modified
2026-03-10
1
<p>У всех нас есть лайфхаки и инструменты, ускоряющие работу с определенными задачами и системами. У девопсов и администраторов облаков таких инструментов должно быть едва ли не больше всех, потому что сервисов, с которыми работать, - много, а терминал один. В этой статье я делюсь своим опытом работы с облачными системами и решением мелких задач, которые возникают каждый день.</p>
1
<p>У всех нас есть лайфхаки и инструменты, ускоряющие работу с определенными задачами и системами. У девопсов и администраторов облаков таких инструментов должно быть едва ли не больше всех, потому что сервисов, с которыми работать, - много, а терминал один. В этой статье я делюсь своим опытом работы с облачными системами и решением мелких задач, которые возникают каждый день.</p>
2
<h2>ZSH</h2>
2
<h2>ZSH</h2>
3
<p>Начнем с самого часто используемого инструмента - интерпретатора командной строки. Я использую zsh - из‑за плагинов, тем и возможностей автодополнения. Автодополнение из истории сильно сокращает время набора команд, а плагины еще больше расширяют автодополнение, обеспечивают подсветку синтаксиса, добавляют полезные алиасы.</p>
3
<p>Начнем с самого часто используемого инструмента - интерпретатора командной строки. Я использую zsh - из‑за плагинов, тем и возможностей автодополнения. Автодополнение из истории сильно сокращает время набора команд, а плагины еще больше расширяют автодополнение, обеспечивают подсветку синтаксиса, добавляют полезные алиасы.</p>
4
<p>Два наиболее полезных плагина:</p>
4
<p>Два наиболее полезных плагина:</p>
5
<ul><li><strong>git</strong>- отображает ветки/коммиты/репозитории. Наглядно видно, в каком репозитории находишься, инициализирован ли он, какая ветка, коммит, синхронизировано ли с удаленным репозиторием и прочее;</li>
5
<ul><li><strong>git</strong>- отображает ветки/коммиты/репозитории. Наглядно видно, в каком репозитории находишься, инициализирован ли он, какая ветка, коммит, синхронизировано ли с удаленным репозиторием и прочее;</li>
6
<li><strong>zsh-syntax-highlighting</strong>- подсветка синтаксиса в консоли. Удобно при написании и отладке скриптов.</li>
6
<li><strong>zsh-syntax-highlighting</strong>- подсветка синтаксиса в консоли. Удобно при написании и отладке скриптов.</li>
7
</ul><p>Подсветка веток в GitПодсветка веток в Git:</p>
7
</ul><p>Подсветка веток в GitПодсветка веток в Git:</p>
8
<p>Также рекомендую установить плагины для каждодневно используемых инструментов: AWS, Docker, brew, knife, node, encode64, kubectl, osx, Python, pip. Практически все добавляют подсказки по табу, что уже очень полезно, некоторые по этому же табу стучатся в API сервисов и предлагают расширенное автодополнение, а не только возможные команды.</p>
8
<p>Также рекомендую установить плагины для каждодневно используемых инструментов: AWS, Docker, brew, knife, node, encode64, kubectl, osx, Python, pip. Практически все добавляют подсказки по табу, что уже очень полезно, некоторые по этому же табу стучатся в API сервисов и предлагают расширенное автодополнение, а не только возможные команды.</p>
9
<p>Плагины AWS и kubectl делают еще одну важную вещь - всегда показывают контекст/профиль, в котором работаешь, и сильно снижают шансы ошибиться и вкинуть какую‑нибудь опасную команду не в тот терминал. Плюс, к примеру, расширение для амазона умеет считывать назначенные профилям цвета, и, если будешь работать в проде, можно подкрасить профиль ярко‑красным, чтобы точно понимать, где выполняется команда.</p>
9
<p>Плагины AWS и kubectl делают еще одну важную вещь - всегда показывают контекст/профиль, в котором работаешь, и сильно снижают шансы ошибиться и вкинуть какую‑нибудь опасную команду не в тот терминал. Плюс, к примеру, расширение для амазона умеет считывать назначенные профилям цвета, и, если будешь работать в проде, можно подкрасить профиль ярко‑красным, чтобы точно понимать, где выполняется команда.</p>
10
<p>Подсветка профиля AWSПодсветка профиля AWS:</p>
10
<p>Подсветка профиля AWSПодсветка профиля AWS:</p>
11
<p>Подсветка профиля kubectlПодсветка профиля kubectl:</p>
11
<p>Подсветка профиля kubectlПодсветка профиля kubectl:</p>
12
<p>Хорошая тема: powerlevel10k, гибкая, красивая, информативная, можно настроить по вкусу очень много вещей. Особенно удобен сквош исполненных команд после выполнения, чтобы не засорять экран.</p>
12
<p>Хорошая тема: powerlevel10k, гибкая, красивая, информативная, можно настроить по вкусу очень много вещей. Особенно удобен сквош исполненных команд после выполнения, чтобы не засорять экран.</p>
13
<p>Плагины, как и темы, установить довольно просто. Если заморачиваться - для этого есть плагин/пакет‑менеджеры для zsh вроде<strong>antigen</strong>или<strong>Zinit</strong>. Но в целом установка сводится к git clone и запуску скрипта, который сам все настроит. Для поиска плагинов лучше всего использовать подборки на GitHub вроде<strong>awesome-zsh-plugins</strong>.</p>
13
<p>Плагины, как и темы, установить довольно просто. Если заморачиваться - для этого есть плагин/пакет‑менеджеры для zsh вроде<strong>antigen</strong>или<strong>Zinit</strong>. Но в целом установка сводится к git clone и запуску скрипта, который сам все настроит. Для поиска плагинов лучше всего использовать подборки на GitHub вроде<strong>awesome-zsh-plugins</strong>.</p>
14
<h2>SCREEN И TMUX</h2>
14
<h2>SCREEN И TMUX</h2>
15
<p><strong>Screen</strong>- это эмулятор (а точнее, мультиплексор) терминальных сессий VT100. Но обычно его используют как способ безопасно выполнить команды через SSH на случай прерывания соединения.</p>
15
<p><strong>Screen</strong>- это эмулятор (а точнее, мультиплексор) терминальных сессий VT100. Но обычно его используют как способ безопасно выполнить команды через SSH на случай прерывания соединения.</p>
16
<p>К примеру, ты запускаешь "долгоиграющую" команду вроде apt-get upgrade и в этот момент соединение с сервером обрывается. В итоге дочерний процесс apt-get-сессии SSH умирает и процесс обновления пакетов останавливается. Чтобы этого не произошло, просто запусти screen и уже в нем запускай все нужные команды. Теперь, если соединение оборвется, родительский процесс screen останется жив и не только позволит команде корректно завершиться, но и позволит заново подключиться к существующей сессии, причем неважно, с какого устройства.</p>
16
<p>К примеру, ты запускаешь "долгоиграющую" команду вроде apt-get upgrade и в этот момент соединение с сервером обрывается. В итоге дочерний процесс apt-get-сессии SSH умирает и процесс обновления пакетов останавливается. Чтобы этого не произошло, просто запусти screen и уже в нем запускай все нужные команды. Теперь, если соединение оборвется, родительский процесс screen останется жив и не только позволит команде корректно завершиться, но и позволит заново подключиться к существующей сессии, причем неважно, с какого устройства.</p>
17
<p>Screen позволяет запускать множество терминалов в рамках одной SSH-сессии:</p>
17
<p>Screen позволяет запускать множество терминалов в рамках одной SSH-сессии:</p>
18
<p>У Screen есть более современная альтернатива под названием<strong>tmux</strong>. Ее разработали парни из OpenBSD, и в целом она отличается более высокой производительностью и наличием различных современных плюшек, вроде поддержки плагинов. Сразу рекомендую установить плагин tmux-resurrect, позволяющий сохранить текущий набор открытых в tmux терминалов в файл и восстановить его, когда понадобится выполнить схожую задачу.</p>
18
<p>У Screen есть более современная альтернатива под названием<strong>tmux</strong>. Ее разработали парни из OpenBSD, и в целом она отличается более высокой производительностью и наличием различных современных плюшек, вроде поддержки плагинов. Сразу рекомендую установить плагин tmux-resurrect, позволяющий сохранить текущий набор открытых в tmux терминалов в файл и восстановить его, когда понадобится выполнить схожую задачу.</p>
19
<h2>JQ</h2>
19
<h2>JQ</h2>
20
<p>Взаимодействие с вебом и облачными инфраструктурами по большей части идет в формате JSON. Kubectl и многие другие инструменты также умеют выводить данные в JSON. Поэтому нам нужен JSON-процессор, и лучший из них - это<strong>jq</strong>. Очень удобный инструмент с развитым синтаксисом и достаточной гибкостью, чтобы писать сложные вложенные запросы и условия.</p>
20
<p>Взаимодействие с вебом и облачными инфраструктурами по большей части идет в формате JSON. Kubectl и многие другие инструменты также умеют выводить данные в JSON. Поэтому нам нужен JSON-процессор, и лучший из них - это<strong>jq</strong>. Очень удобный инструмент с развитым синтаксисом и достаточной гибкостью, чтобы писать сложные вложенные запросы и условия.</p>
21
<p>В man json можно найти полную документацию с хорошими примерами использования, да и в целом инструмент настолько популярен, что примеры есть практически для любой задачи. Далее несколько примеров работы с Kubernetes.</p>
21
<p>В man json можно найти полную документацию с хорошими примерами использования, да и в целом инструмент настолько популярен, что примеры есть практически для любой задачи. Далее несколько примеров работы с Kubernetes.</p>
22
<p>Посмотреть выставленные переменные окружения в контейнерах:</p>
22
<p>Посмотреть выставленные переменные окружения в контейнерах:</p>
23
$ kubectl get pods --all-namespaces -o json | jq '.items[].spec.containers[].env[]?'<p>Поиск поврежденных деплойментов:</p>
23
$ kubectl get pods --all-namespaces -o json | jq '.items[].spec.containers[].env[]?'<p>Поиск поврежденных деплойментов:</p>
24
$ 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)'<p>Быстро посмотреть, какие образы доступны на нодах (часто помогает при проблеме с кешированием и скачиванием образов новых версий):</p>
24
$ 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)'<p>Быстро посмотреть, какие образы доступны на нодах (часто помогает при проблеме с кешированием и скачиванием образов новых версий):</p>
25
$ kubectl get nodes -o json | jq '.items[] | .status .images[]'`<p>Схоже с предыдущей, вариант быстрого просмотра доступных ресурсов на нодах, удобно пользоваться в связке со скриптами:</p>
25
$ kubectl get nodes -o json | jq '.items[] | .status .images[]'`<p>Схоже с предыдущей, вариант быстрого просмотра доступных ресурсов на нодах, удобно пользоваться в связке со скриптами:</p>
26
$ kubectl get nodes -o json | jq '.items[] | .status .allocatable'
26
$ kubectl get nodes -o json | jq '.items[] | .status .allocatable'