![](https://habrastorage.org/webt/ix/-r/qm/ix-rqm7zwhdwcm8efxwpqy_20uu.png)
Решили мы однажды заняться автоматизацией наших рутинных рабочих моментов. Создать у себя ансамбль(ansible) или что-нибудь в этом роде. Я полез на сайт ансамбля, посмотрел как он работает … подключается к удаленному серверу через ssh и выполняет какие-то там скрипты... Стоп, подумал я, разве для этого нужен ансамбль? Я и без ансамбля, сам ..., один… могу это сделать! А чтобы не только лишь я это мог, решил написать вэб приложение. Приложение назвали Update Server, сокращенно UpS.
Ворнинг! Под катом много картинок и пара гифок.
Приложение я решил делать при помощи питона и джанги. Тут хватает специалистов и «специалистов» и по тому и по другому. Поэтому я не буду сейчас мериться количеством строк кода. Желающие могут заглянуть сюда секретов там нет, а большинство команд
![](https://habrastorage.org/getpro/habr/post_images/b05/83a/5fa/b0583a5fa9cc7a4959403d4b9270c166.png)
Но обо всем по порядку, начинается всё с такой незатейливой странички с описанием.
![](https://habrastorage.org/webt/ox/7u/ey/ox7ueyxkblijiskghcqp9iesnce.png)
Кликнув в джумботрон Projects мы попадаем на страничку выбора проектов.
![](https://habrastorage.org/webt/9k/gf/59/9kgf59looojwighiwr_sohgw0r8.png)
Выбрав проект попадаем на основную страницу со списком серверов, скриптов и т.д.
![](https://habrastorage.org/getpro/habr/post_images/b05/83a/5fa/b0583a5fa9cc7a4959403d4b9270c166.png)
Перейдем к подробностям. В приложении обозначилось несколько сущностей: сервер(server), скрипт(script), пакет обновления(update), задача в кроне(cron job), событие в истории(event), проект(project) и не совсем сущьность дамп(dump).
Небольшое лирическое отступление
Играем с сыном в Titan quest, вернее я играю, а он смотрит) Там из монстров выпадают некие артефакты, в русской версии называющиеся сущностями. Вот в один прекрасный день выпала мне какая-то сущность Ахилеса чего-то там. На картинке что-то другое, но из той же оперы)
Сын увидел и кричит:
— пап, гляди суЧность Ахилеса!)
![](https://habrastorage.org/getpro/habr/post_images/7dc/2f0/824/7dc2f0824d47a6864b9a114975c7da1d.jpg)
Сын увидел и кричит:
— пап, гляди суЧность Ахилеса!)
Основной сущностью является проект. К проекту цепляются серверы, скрипты, апдейты. Создаются задания в кроне и дампы. Объекты разбросаны по соответствующим закладкам. Слева располагается меню со списком команд. Пробежимся по закладкам. Первая закладка скрипты.
![](https://habrastorage.org/webt/6m/fq/ys/6mfqysp6tpqlwcdleseldzdu2m4.png)
Тут мы видим доступные скрипты и серверы(серверы доступны на всех закладках, т.к. нужны практически всегда). Скрипты можно загружать из файла или создавать в интерфейсе кнопкой Add. Поддерживаются SH, PY, YML и SQL скрипты.
![](https://habrastorage.org/webt/0j/oh/nl/0johnlmidedyt-kulfko_lpu0xy.png)
Идем дальше, пакеты обновлений.
![](https://habrastorage.org/webt/g3/70/uz/g370uz0e-btpj5pc1ak7mj2xt6q.png)
На этой закладке можно добавлять новые апдейты, копировать их на серверы, выполнять обновление.
![](https://habrastorage.org/webt/do/ln/ao/dolnaobg2iri-lwgbkwljpgjiro.png)
Дальше идут дампы.
![](https://habrastorage.org/webt/ua/vd/gu/uavdgub5174aao1jw2no6pmmuds.png)
Тут отображается список файлов, полученных командой Get dump или закачанные сюда с компа.
![](https://habrastorage.org/webt/4s/_t/_h/4s_t_hpbk8j3b9kgxkuobbeewbs.png)
![](https://habrastorage.org/webt/qk/4y/9o/qk4y9oopfhcrqwfgvo9ezg6dxeg.png)
Все это безобразие можно запускать через крон. На этой закладке отображаются активные задачи.
![](https://habrastorage.org/webt/7j/ds/g4/7jdsg43kqp8rd6kv5pmythl7t-g.png)
Логи выполняющихся команд появляются тут.
![](https://habrastorage.org/webt/66/lw/yx/66lwyxz6iphipg4cugj2nuhere8.png)
С логами ничего делать нельзя, все уже сделано, сиди и смотри что получилось) Клик на табличку лога открывает его в отдельном окне. Если выполняется несколько процессов появляется кнопка All logs, открывает все логи в одном окне(я забыл сделать этот скриншот).
Серверы. Как я уже говорил, список серверов доступен на всех закладках.
![](https://habrastorage.org/webt/l4/6s/tu/l46stukvoee5smkwqsmgviwmhwk.png)
![](https://habrastorage.org/webt/10/1g/rm/101grmsc1awvwq6zmlfah6hezpc.png)
Maintenance ON\OFF — включить\отключить страницу «Регламентные работы» на время регламентных работ O_o или если что-то пошло не так(после send dump например).
Reload config — перезагружает конфиг jboss'а(наш проект использует jboss).
Restart\start\stop\kill jboss — остановка, запуск, перезапуск jboss'а и жестокое убийство если уже ничего не помогает)
Дальше разные полезные штуки:
System info — показывает информацию о сервере: память, диск, процессор, пользователи, процессы.
Check health — быстрая проверка работоспособности приложения, ищет процесс приложения, проверяет открыт ли порт и пытается курлом в этот порт постучаться.
Check conf — показывает конфигурационный файл приложения.
Check logs — показывает логи приложения.
Check GC log — показывает лог гарбаж колектора.
Get day\week\month\all logs — позволяет скачать логи за определенное время одним архивом.
Backup base\system\full — создает резервную копию базы, файлов приложения, делает и то и другое.
Copy utils — копирует всякие разные скриптики на сервер.
Peep passwords — позволяет подсмотреть пароль админа.
Check updates — показывает какие файлы обновлений закачаны на сервер.
Create tunnel — делает проброс порта приложения, с сервера приложения на UpS'а (у нас ведь ssh). Можно подключиться к порту приложения напрямую. Полезно для проверки работоспособности в случае отсутствия доступа(http\s) по основному адресу.
Команды System info, Check health, Check conf, Check logs, Peep passwords, Check updates и Create tunnel имеют «быстрые» аналоги непосредственно на панели каждого сервера.
В верхней панели есть ссылка History, в истории записывается результат выполнения всех(почти) команд. На просмотр истории и выполнение команд необходимы пермишоны. Пермишоны навешиваются стандартной джанговской админкой. Единственное что я тут добавил, прикрутил библиотеку джанго-гардиан, которая позволяет навешивать пермишоны на объекты, мне это показалось очень удобным, а джанга не умеет делать это из коробки.
Я конечно не уи гуру, но постарался сделать управление легким и не принужденным) Прокликиваем необходимые объекты, выбираем команду и
![](https://habrastorage.org/webt/6p/tv/3k/6ptv3kea50you8aldo1zswx_2ko.gif)
Пара слов о том, как это все работает. Питон и джанга, как я уже говорил, вьювс, моделс, урлс, формс, вот это вот все и есть такой файлик commands.py. В этом файлике описываются доступные команды(пока все логично, да?). Выглядит это как-то так:
class CommandClass:
"""Класс команды"""
def __init__(
self,
permission='run_command', # Permission needed to run this command.
position=1, # Position in commands list
section='', # Section command will be placed to.
style='', # Class assigned to a command button
title='', # Pop up help message(via title)
short='', # Short name for commands in quick section
menu='', # Command name in UI
name='', # Command name(an internal command name)
run='', # Prevent CRONing
his=True, # Command log will be saved to history
fst=False, # Add command to quick section
dgr='false', # If true will show confirmation window
job='false', # Check if some cron jobs selected
srv='false', # Check if some servers selected
upd='false', # Check if some updates selected
scr='false', # Check if some scripts selected
dmp='false', # Check if some dumps selected
):
self.permission = permission
self.position = position
self.section = section
self.style = style
self.title = title
self.short = short
self.name = name
self.menu = menu
self.run = run
self.his = his
self.fst = fst
self.srv = srv
self.upd = upd
self.job = job
self.scr = scr
self.dmp = dmp
self.dgr = dgr
И все существующие команды описываются в словарике commandick. Название словарика это некая игра слов command(команда) и dictionary(словарь), знатоки английского наверное найдут еще какой-нибудь скрытый смысл. Словарик:
commandick = {
# Cron submenu }-----------------------------------
'cancel_job': CommandClass(
permission='run_cron',
position=4,
section='cron',
title='Cancel selected cron job(s).',
name='cancel_job',
menu='Remove job',
job='true',
run="run_or_cron('RUN');",
),
'permanent_job': CommandClass(
permission='run_cron',
position=3,
section='cron',
title='Make selected cron job(s) permanent.',
name='permanent_job',
menu='Run everyday',
job='true',
run="run_or_cron('RUN');",
),
...
'tunnel': CommandClass(
permission='tunnel',
position=80,
section='server',
title='Make ssh tunnel to the bind port of selected server(s).',
short='Tunnel',
name='tunnel',
menu='Create tunnel',
run="run_or_cron('RUN');",
srv='true',
his=False,
fst=True,
),
'test_ssh': CommandClass(
permission='tunnel',
position=90,
section='server',
title='Test ssh connection.',
short='Tunnel',
name='test_ssh',
menu='Test ssh',
run="run_or_cron('RUN');",
srv='true',
his=False,
),
}
Каждая команда это отдельный модуль в папке modules. Запускаются команды отдельным процессом, если выбрано несколько серверов, то для каждого создается свой процесс скрипт starter.py, он импортирует и выполняет нужный модуль(команду). Придумал новую фичу? Добавляешь файлик в папку modules и описываешь в словарике,
другие поделки
В заключение хочу упомянуть еще парочку своих поделок. Для самых маленьких раскраска. Скриптик упрощающий процесс раскрашивания других скриптиков:
Для ребят постарше, проводящих много времени в консоли, симпатичная информационная панель.
![image](https://habrastorage.org/getpro/habr/post_images/34a/1d4/923/34a1d492380d3358a820118c2d61fbe1.png)
Для тех, кому уже тесно в рамках локалхоста, есть скриптик, создающий меню(dialog) из вашего ~/.ssh/config. Все знают, зачем нужен ~/.ssh/config?) Выглядит это так:
![image](https://habrastorage.org/getpro/habr/post_images/509/0da/030/5090da030cd0deea040934c46a4e81a8.png)
И конечно же ПИУ-ПИУ!
Пиу-пиу многим понравилась(больше 550 звезд на гитхабе), спасибо всем за добрые слова и за помощь! Не слышали про пиу-пиу? Скорей читайте тут, тут и тут. Хочу развить сюжет дальше и сделать игру больше, есть идеи по оптимизации но катастрофически не хватает времени. Новогодние праздники как нельзя кстати, надеюсь получится поработать над игрой. Кстати, пиу-пиу можно установить apt'ом:
![image](https://habrastorage.org/getpro/habr/post_images/e94/6d9/c3b/e946d9c3b11a12aee27dc02d2561f921.gif)
С наступающим!)
#--------------------------------------------------------------------+
#Color picker, usage: printf $BLD$CUR$RED$BBLU'Hello World!'$DEF |
#-------------------------+--------------------------------+---------+
# Text color | Background color | |
#-----------+-------------+--------------+-----------------+ |
# Base color|Lighter shade| Base color | Lighter shade | |
#-----------+-------------+--------------+-----------------+ |
BLK='\e[30m'; blk='\e[90m'; BBLK='\e[40m'; bblk='\e[100m' #| Black |
RED='\e[31m'; red='\e[91m'; BRED='\e[41m'; bred='\e[101m' #| Red |
GRN='\e[32m'; grn='\e[92m'; BGRN='\e[42m'; bgrn='\e[102m' #| Green |
YLW='\e[33m'; ylw='\e[93m'; BYLW='\e[43m'; bylw='\e[103m' #| Yellow |
BLU='\e[34m'; blu='\e[94m'; BBLU='\e[44m'; bblu='\e[104m' #| Blue |
MGN='\e[35m'; mgn='\e[95m'; BMGN='\e[45m'; bmgn='\e[105m' #| Magenta |
CYN='\e[36m'; cyn='\e[96m'; BCYN='\e[46m'; bcyn='\e[106m' #| Cyan |
WHT='\e[37m'; wht='\e[97m'; BWHT='\e[47m'; bwht='\e[107m' #| White |
#----------------------------------------------------------+---------+
# Effects |
#--------------------------------------------------------------------+
DEF='\e[0m' #Default color and effects |
BLD='\e[1m' #Bold\brighter |
DIM='\e[2m' #Dim\darker |
CUR='\e[3m' #Italic font |
UND='\e[4m' #Underline |
INV='\e[7m' #Inverted |
COF='\e[?25l' #Cursor Off |
CON='\e[?25h' #Cursor On |
#--------------------------------------------------------------------+
# Text positioning, usage: XY 10 10 'Hello World!' |
XY () { printf "\e[$2;${1}H$3"; } # |
#--------------------------------------------------------------------+
# Print line, usage: line - 10 | line -= 20 | line 'Hello World!' 20 |
line () { printf -v LINE "%$2s"; printf "${LINE// /$1}"; } # |
#--------------------------------------------------------------------+
Для ребят постарше, проводящих много времени в консоли, симпатичная информационная панель.
![image](https://habrastorage.org/getpro/habr/post_images/34a/1d4/923/34a1d492380d3358a820118c2d61fbe1.png)
Для тех, кому уже тесно в рамках локалхоста, есть скриптик, создающий меню(dialog) из вашего ~/.ssh/config. Все знают, зачем нужен ~/.ssh/config?) Выглядит это так:
![image](https://habrastorage.org/getpro/habr/post_images/509/0da/030/5090da030cd0deea040934c46a4e81a8.png)
И конечно же ПИУ-ПИУ!
Пиу-пиу многим понравилась(больше 550 звезд на гитхабе), спасибо всем за добрые слова и за помощь! Не слышали про пиу-пиу? Скорей читайте тут, тут и тут. Хочу развить сюжет дальше и сделать игру больше, есть идеи по оптимизации но катастрофически не хватает времени. Новогодние праздники как нельзя кстати, надеюсь получится поработать над игрой. Кстати, пиу-пиу можно установить apt'ом:
sudo apt install -y piu-piu
![image](https://habrastorage.org/getpro/habr/post_images/e94/6d9/c3b/e946d9c3b11a12aee27dc02d2561f921.gif)
С наступающим!)
Комментарии (11)
gecube
28.12.2018 00:45мне вспоминается, как коллеги показывали какую-то самодельную систему для автоматизации выполнения тасков на серверах. Тот еще велосипед. К сожалению, ссылку потерял. Точно помню, что у нее было какое-то очень смешное название и вроде бы она была на php или python…
gecube
28.12.2018 01:37habr.com/company/croc/blog/318532
Нашел. Вот он — эталонный велосипед для автоматизации инфраструктуры. А не то что «без ансамбля»
PAE
28.12.2018 14:17NIH — что только люди не придумают, лишь бы не использовать уже созданное. Jenkins мог бы решить почти все описанные кейсы.
Само собой, дело ваше — решает задачи и хорошо.
staticmain
Мы изначально тоже хотели сделать web-морду, потом передумали, чтобы лишние дырки не крутить. Поэтому сделали примерно так:
Так как у нас jump-сервер для входа на узлы пришлось поизвращаться с тремя уровнями expect.
gecube
ProxyJump в OpenSSH (вроде с версии 7.3) пробовали?
Очень крутая опция!!!
staticmain
Насколько я помню, когда мы это делали из доступных опций была только -tt, но у нее есть проблема — некорректно переадресуются stdout\stderr. Так что когда-то сделали как сделали.
P.S. Сейчас проверил на своей xU16.04 — такой опции (-J) нет.
gecube
Ну, мне ради нее пришлось обновиться с
7.2 на
Не жалею. Оно стоит того.
больше костылей и велосипедов!!!
vaniacer Автор
Expect у меня тоже используется чтобы сказать "yes" при первом подключении.