HTML Diff
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 &gt; 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 &gt; 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'