Sem conjunto



Uma vez decidimos fazer a automação dos nossos momentos de trabalho de rotina. Crie seu próprio conjunto (ansible) ou algo assim. Subi ao site do conjunto, vi como ele funciona ... ele se conecta ao servidor remoto via ssh e executa algum tipo de script por aí ... Pare, pensei, isso realmente precisa de um conjunto? Sem um conjunto, eu mesmo ... sozinho ... posso fazê-lo! E para que não apenas eu pudesse, decidi escrever um aplicativo da web. O aplicativo foi chamado Update Server , abreviado como UpS .

Worning! Sob o corte muitas fotos e alguns gifs.

Eu decidi fazer o aplicativo usando python e dzhanga. Existem especialistas e "especialistas" suficientes nesse e no outro. Portanto, não vou medir o número de linhas de código agora. Os interessados podem procurar aqui, não há segredos, e a maioria das equipes é codificada de maneira especializada para o nosso projeto. Vou contar (e mostrar) apenas sobre quais funcionalidades foram implementadas no aplicativo. Então aqui. Peguei meu python, a propósito, meu python não é muito grande, normal, média 2,7. Peguei para ele um dzhang 1.10 novinho (na época) e comecei a conectá-los. E tão e tão conectado. Entrei de cima e de baixo, de todas as maneiras que tentei. E assim acabou no final.


Mas, antes de tudo, tudo começa com uma página tão simples com uma descrição.


Ao clicar no jumbotron Projetos , chegamos à página de seleção do projeto.


Tendo selecionado o projeto, chegamos à página principal com uma lista de servidores, scripts etc.


Vamos aos detalhes. O aplicativo identificou várias entidades: servidor (servidor), script (script), service pack (atualização), tarefa na coroa (tarefa cron), evento na história (evento), projeto (projeto) e não é exatamente a essência do despejo (despejo).

Uma ligeira digressão
Nós brincamos com meu filho na missão Titã, ou melhor, eu brinco, e ele parece) Lá, alguns artefatos, chamados entidades na versão russa, abandonam os monstros. Um belo dia, algum tipo de essência de Aquiles caiu sobre mim lá. A imagem é outra coisa, mas da mesma ópera)
O filho viu e gritou:
- Pai, veja a credibilidade de Aquiles!)

A essência principal é o projeto. Servidores, scripts, atualizações se apegam ao projeto. Trabalhos e despejos Crown são criados. Os objetos estão espalhados nas guias correspondentes. À esquerda, há um menu com uma lista de comandos. Vamos revisar os marcadores. Primeiros scripts de favoritos.


Aqui vemos os scripts e servidores disponíveis (os servidores estão disponíveis em todas as guias, porque quase sempre são necessários). Os scripts podem ser carregados de um arquivo ou criados na interface com o botão Adicionar . Suportado por scripts SH, PY, YML e SQL. No painel de script, há uma descrição ( descrição ), um pedaço de código ( visualização ), autor e data. Para scripts SH e PY, é possível adicionar opções (campo de opções ). O script (e qualquer outro objeto) é selecionado clicando em qualquer parte do painel (exceto nos botões "rápidos"). Clique no script (segundo, terceiro, etc.), clique no servidor (segundo, terceiro, etc.) e clique no script Executar . O script ou scripts selecionados serão executados no servidor ou servidores selecionados. Se você precisar executar um script "rápido", poderá usar o botão "rápido" no painel de scripts, clicar no servidor (segundo, terceiro etc.) e clicar em Executar do script desejado. Enquanto escrevia um artigo, as mudanças apareceram. Scripts SQL separados do restante, adicionou um comando e um permissão separados para executar esquels. Isso permitiu, por exemplo, conceder apenas direitos para executar esquels, porque SH e PY são muito mais poderosos, oferecem possibilidades quase ilimitadas. Mas não refiz as capturas de tela) eu podia me limitar a scripts, quase tudo podia ser feito com elas, mas já era difícil parar).
Vá em frente, service packs.


Nesta guia, você pode adicionar novas atualizações, copiá-las para servidores, executar atualizações. De fato, pode haver qualquer arquivo, pois neste exemplo um arquivo txt comum é usado como uma atualização de teste. Você carrega um arquivo no servidor (na maioria das vezes é um zip) e, de alguma forma, usa-o usando scripts. As atualizações também têm uma descrição, autor, data e tamanho mostrados.
Em seguida, vêm os lixões.


Ele exibe uma lista de arquivos recebidos pelo comando Get dump ou baixados aqui do computador. Os despejos não têm uma descrição, há apenas um nome, tamanho e tempo de criação. Provavelmente não apenas todos pelo menos uma vez (dois, três) atingiram a base alimentar? Aproveitei esta oportunidade para um novo nível) Enviar dump este comando implanta a base do servidor a partir do dump selecionado. Sinta a oportunidade? (Você ouve o barulho de peido) Sim, em mãos incapazes, este comando pode matar TODAS as bases em TODOS os servidores com apenas alguns cliques! É por isso que o botão deste (e similar) comando é pintado em vermelho, deve ser pressionado com muito cuidado. Para despejos de volume, é obviamente problemático de usar, mas para pequenas bases de teste é uma coisa muito conveniente. Cron.


Toda essa desgraça pode ser executada através das coroas. Essa guia exibe as tarefas ativas. Cada tarefa possui um identificador único ( crontab id ), necessário para manipulações subsequentes com ele. A descrição indica o que a tarefa fará. No exemplo, execute o script test2.sh no servidor com o endereço jboss @ localhost. A hora de início da tarefa é indicada no campo Data de início no formato AAAA-MM-DD HH: MM O autor e a hora de criação são indicados. Você pode cancelar a tarefa, alterar a hora, tornar a tarefa permanente (será executada todos os dias no horário especificado) ou vice-versa, uma vez.
Os logs dos comandos em execução são exibidos aqui.


Você não pode fazer nada com os logs, tudo já está pronto, sente-se e veja o que aconteceu) Clicar no prato de registro abre-o em uma janela separada. Se vários processos estiverem em execução, o botão Todos os logs aparece, abre todos os logs em uma janela (esqueci de tirar esta captura de tela).

Servidores. Como eu disse, a lista de servidores está disponível em todas as guias. O servidor exibe o endereço (endereço ssh ), pode ser escrito no formato user @ address, mas é melhor usar aliases ssh (~ / .ssh / config) e especificar alguns nomes significativos. Endereço HTTP é o URL de um aplicativo implantado em um servidor. A pasta de trabalho ( pasta do servidor ) e a porta (porta de ligação do servidor ), é a pasta na qual o aplicativo está localizado e a porta que ele abre, respectivamente. Descrição, autor, data. A captura de tela mostrava alguns novos comandos adicionados no momento da redação: Prop e Full . Temos dois arquivos de configuração principais, esses comandos permitem que você os edite convenientemente. O resto da equipe. Primeiro vermelho:
Manutenção ON \ OFF - ative / desative a página Trabalhos agendados para manutenção agendada O_o ou se algo der errado (após enviar o dump, por exemplo).
Recarregar configuração - recarrega a configuração do jboss (nosso projeto usa o jboss).
Reinicie \ start \ stop \ kill jboss - pare, inicie, reinicie o jboss e uma brutal matança se nada mais ajudar)
Além disso, várias coisas úteis:
Informações do sistema - mostra informações sobre o servidor: memória, disco, processador, usuários, processos.
Verificar integridade - uma verificação rápida da integridade do aplicativo, ele procura o processo do aplicativo, verifica se a porta está aberta e tenta bater nessa porta com uma curvatura
Verificar conf - mostra o arquivo de configuração do aplicativo.
Verificar logs - mostra os logs do aplicativo.
Verificar log do GC - mostra o coletor de lixo do log.
Obter dia \ semana \ mês \ todos os logs - permite fazer o download de logs por um certo tempo em um arquivo morto.
Base de backup \ system \ full - cria uma cópia de backup do banco de dados, os arquivos do aplicativo, fazem as duas coisas.
Copiar utilitários - copia todos os tipos de scripts diferentes para o servidor.
Peep senhas - permite que você remova a senha do administrador.
Verificar atualizações - mostra quais arquivos de atualização são carregados no servidor.
Criar túnel - encaminha a porta do aplicativo do servidor de aplicativos para o UpS ( afinal , temos ssh). Você pode conectar-se diretamente à porta do aplicativo. Útil para verificar a funcionalidade em caso de falta de acesso (http \ s) ao endereço principal.
Os comandos Informações do sistema , Verificar integridade , Verificar conf , Verificar logs , Peep senhas , Verificar atualizações e Criar túnel têm análogos "rápidos" diretamente no painel de cada servidor.
Há um link Histórico no painel superior, o resultado da execução de quase todos os comandos é registrado no histórico. Permitadores são necessários para visualizar o histórico e executar comandos. Os Permichons são pendurados pelo painel de administração padrão do Dzhangovsky. A única coisa que adicionei aqui, eu estraguei a biblioteca django-guardian, que permite anexar permichões a objetos, me pareceu muito conveniente, mas o djanga não pode fazê-lo imediatamente.

É claro que não sou um guru da internet, mas tentei facilitar o gerenciamento e não ser forçado) Clique nos objetos necessários, selecione a equipe e pronto . Clique no botão para obter o resultado. Algo assim.


Algumas palavras sobre como tudo funciona. Python e dzhanga, como eu disse, visualizações, modelos, URLs, formulários, isso é tudo o que existe nesse arquivo commands.py . Os arquivos disponíveis são descritos neste arquivo (até agora tudo é lógico, certo?). Parece algo como isto:
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 

E todos os comandos existentes são descritos no dicionário commandick . O nome do dicionário é uma espécie de comando de jogo de palavras (comando) e dicionário (dicionário); os conhecedores de inglês provavelmente encontrarão algum outro significado oculto. Dicionário:
 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, ), } 

Cada comando é um módulo separado na pasta modules . Os comandos são iniciados por um processo separado. Se vários servidores são selecionados, um script starter.py é criado para cada um , importa e executa o módulo desejado (comando). Você criou um novo recurso? Adicione o arquivo à pasta modules e descreva no dicionário, oh tudo. Aqui está uma aplicação. Comentários em massa de Vangyu sobre construção de bicicletas. Para sua altura ... contos, eu gostaria de responder a isso. Por que as pessoas continuam criando novas pessoas? Afinal, as pessoas já estão fazendo ... até certo ponto, muito. Porque eu gosto do processo) Então, eu gosto do processo, que também desejo a você, crie, invente, tente)

outros ofícios
Concluindo, quero mencionar mais alguns dos meus trabalhos. Para o menor livro de colorir . Um script que simplifica o processo de colorir outros scripts:
 #--------------------------------------------------------------------+ #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}"; } # | #--------------------------------------------------------------------+ 

Para crianças mais velhas, gastando muito tempo no console, um bom painel .
imagem

Para aqueles que já estão intimamente dentro da estrutura do host local, existe um script que cria um menu (diálogo) a partir do seu ~ / .ssh / config . Todo mundo sabe por que o ~ / .ssh / config é necessário?) É assim:
imagem

E, claro, PIE-PIE!
Muitos gostaram do Piu-Piu (mais de 550 estrelas no github), obrigado a todos por suas amáveis ​​palavras e por sua ajuda! Não ouviu falar de piu-piu? Leia aqui , aqui e aqui . Quero desenvolver ainda mais o enredo e aumentar o jogo, tenho idéias para otimização, mas não há tempo suficiente. Férias de Ano Novo são muito bem-vindas, espero poder trabalhar no jogo. A propósito, o piu-piu pode ser instalado em:
 sudo apt install -y piu-piu 

imagem

Feliz Ano Novo!)

Source: https://habr.com/ru/post/pt428439/


All Articles