Sans ensemble



Nous avons une fois décidé de faire l'automatisation de nos moments de travail de routine. Créez votre propre ensemble (ansible) ou quelque chose comme ça. J'ai grimpé sur le site Web de l'ensemble, j'ai regardé comment cela fonctionne ... il se connecte au serveur distant via ssh et y exécute une sorte de scripts ... Arrêtez-vous, pensais-je, est-ce que cela nécessite vraiment un ensemble? Sans ensemble, moi-même ... seul ... je peux le faire! Et pour que non seulement je puisse, j'ai décidé d'écrire une application web. L'application s'appelait Update Server , abrégée en UpS .

Worning! Sous la coupe, beaucoup de photos et quelques gifs.

J'ai décidé de faire l'application en utilisant python et dzhanga. Il y a suffisamment de spécialistes et de «spécialistes» dans ce domaine et dans l'autre. Par conséquent, je ne mesurerai pas le nombre de lignes de code maintenant. Les personnes intéressées peuvent regarder ici, il n'y a pas de secret, et la plupart des équipes sont spécialisées et codées en dur pour notre projet. Je ne dirai (et ne montrerai) que les fonctionnalités qu'il s'est avéré implémenter dans l'application. Alors voilà. J'ai ramassé mon python, au fait, mon python n'est pas très gros, normal, moyenne 2,7. J'ai obtenu pour lui un tout nouveau dzhang 1.10 (à l'époque) et j'ai commencé à les connecter. Et ainsi de suite. Je suis entré d'en haut et d'en bas, de toutes les manières possibles. Et cela s'est finalement avéré.


Mais d'abord, tout commence par une page aussi simple avec une description.


En cliquant sur Projets jumbotron, nous arrivons à la page de sélection des projets.


Après avoir sélectionné le projet, nous arrivons à la page principale avec une liste de serveurs, scripts, etc.


Passons aux détails. L'application a identifié plusieurs entités: serveur (serveur), script (script), service pack (mise à jour), tâche dans la couronne (tâche cron), événement dans l'historique (événement), projet (projet) et pas tout à fait l'essence du vidage (vidage).

Une légère digression
Nous jouons avec mon fils dans la quête Titan, ou plutôt je joue, et il regarde) Là, des artefacts sortent des monstres, dans la version russe appelée entités. Un beau jour, une sorte d'essence d'Achille m'est tombée dessus. L'image est autre chose, mais du même opéra)
Le fils a vu et a crié:
- Papa, regarde la crédibilité d’Achille!)

L'essence principale est le projet. Les serveurs, scripts, mises à jour s'accrochent au projet. Des emplois et des décharges de la Couronne sont créés. Les objets sont dispersés sur les onglets correspondants. À gauche, un menu avec une liste de commandes. Passons en revue les signets. Premiers scripts de signets.


Ici, nous voyons les scripts et les serveurs disponibles (les serveurs sont disponibles sur tous les onglets, car ils sont presque toujours nécessaires). Les scripts peuvent être chargés à partir d'un fichier ou créés dans l'interface avec le bouton Ajouter . Pris en charge par les scripts SH, PY, YML et SQL. Dans le panneau de script, il y a une description ( description ), un morceau de code ( aperçu ), l'auteur et la date. Pour les scripts SH et PY, il est possible d'ajouter des options (champ d' options ). Le script (et tout autre objet) est sélectionné en cliquant sur n'importe quelle partie du panneau (à l'exception des boutons "rapides"). Cliquez sur le script (deuxième, troisième, etc.), cliquez sur le serveur (deuxième, troisième, etc.) et cliquez sur le script Run . Le ou les scripts sélectionnés seront exécutés sur le ou les serveurs sélectionnés. Si vous devez exécuter un script "rapidement", vous pouvez utiliser le bouton "rapide" du panneau de script, cliquer sur le serveur (deuxième, troisième, etc.) et cliquer sur Exécuter le script souhaité. Lors de la rédaction d'un article, des changements sont apparus. Séparé les scripts SQL du reste, ajouté une commande distincte et un permichon pour exécuter les esquels. Cela a permis, par exemple, de ne donner que les droits d'exécution des esquels, car SH et PY sont beaucoup plus puissants, ils offrent des possibilités presque illimitées. Mais je n'ai pas refait les captures d'écran) je pouvais me limiter aux scripts, presque tout pouvait être fait avec, mais c'était déjà difficile de s'arrêter).
Allez-y, service packs.


Sur cet onglet, vous pouvez ajouter de nouvelles mises à jour, les copier sur les serveurs, effectuer des mises à jour. En fait, il peut s'agir de n'importe quel fichier, car dans cet exemple, un fichier txt normal est utilisé comme mise à jour de test. Vous téléchargez un fichier sur le serveur (le plus souvent, c'est un zip) et l'utilisez en quelque sorte à l'aide de scripts. Les mises à jour ont également une description, un auteur, une date et une taille.
Viennent ensuite les décharges.


Il affiche une liste des fichiers reçus par la commande Get dump ou téléchargés ici depuis l'ordinateur. Les vidages n'ont pas de description, il n'y a qu'un nom, une taille et une heure de création. Probablement pas seulement au moins une fois (deux, trois) a frappé la base alimentaire? J'ai profité de cette opportunité pour un nouveau niveau) Send dump this command deploys the server base from the selected dump. Vous en avez l'opportunité? (Vous entendez le craquement qui pète) Oui, entre des mains incapables, cette commande peut tuer TOUTES les bases sur TOUS les serveurs en quelques clics! C'est pourquoi le bouton de cette commande (et similaire) est peint en rouge, il doit être pressé très soigneusement. Pour les vidages de volume, il est bien sûr problématique à utiliser, mais pour les petites bases de test, c'est une chose très pratique. Cron.


Toute cette honte peut passer par les couronnes. Cet onglet affiche les tâches actives. Chaque tâche a un identifiant unique ( id crontab ), il est nécessaire pour les manipulations ultérieures avec elle. La description indique ce que la tâche fera. Dans l'exemple, exécutez le script test2.sh sur le serveur avec l'adresse jboss @ localhost. L'heure de début de la tâche est indiquée dans le champ Date de début au format AAAA-MM-JJ HH: MM L'auteur et l'heure de création sont indiqués. Vous pouvez annuler la tâche, modifier l'heure, la rendre permanente (elle sera exécutée tous les jours à l'heure spécifiée), ou vice versa, une seule fois.
Les journaux des commandes en cours d'exécution apparaissent ici.


Vous ne pouvez rien faire avec les journaux, tout est déjà fait, asseyez-vous et voyez ce qui s'est passé) Cliquez sur la plaque de journal pour l'ouvrir dans une fenêtre séparée. Si plusieurs processus sont en cours d'exécution, le bouton Tous les journaux apparaît, ouvre tous les journaux dans une seule fenêtre (j'ai oublié de prendre cette capture d'écran).

Serveurs. Comme je l'ai dit, la liste des serveurs est disponible sur tous les onglets. Le serveur affiche l'adresse (adresse ssh ), elle peut être écrite au format utilisateur @ adresse, mais il est préférable d'utiliser des alias ssh (~ / .ssh / config) et de spécifier des noms significatifs. L'adresse HTTP est l'URL d'une application déployée sur un serveur. Le dossier de travail ( dossier du serveur ) et le port (port de liaison du serveur ), c'est le dossier dans lequel se trouve l'application et le port qu'elle ouvre, respectivement. Description, auteur, date. La capture d'écran a montré quelques nouvelles commandes ajoutées au moment de la rédaction: Prop et Full . Nous avons deux fichiers de configuration principaux, ces commandes vous permettent de les modifier facilement. Le reste de l'équipe. Premier rouge:
Maintenance ON \ OFF - active / désactive la page Travaux planifiés pour la maintenance planifiée O_o ou si quelque chose s'est mal passé (après l' envoi d'un vidage par exemple).
Reload config - recharge la configuration jboss (notre projet utilise jboss).
Redémarrez \ start \ stop \ kill jboss - arrêtez, démarrez, redémarrez jboss et un kill brutal si rien d'autre ne vous aide)
En outre, diverses choses utiles:
Informations système - affiche des informations sur le serveur: mémoire, disque, processeur, utilisateurs, processus.
Vérifier la santé - une vérification rapide de la santé de l'application, il recherche le processus de demande, vérifie si le port est ouvert et essaie de frapper sur ce port avec la boucle.
Check conf - affiche le fichier de configuration de l'application.
Vérifier les journaux - affiche les journaux des applications.
Vérifier le journal GC - affiche le ramasse-miettes du journal.
Obtenir jour \ semaine \ mois \ tous les journaux - vous permet de télécharger les journaux pendant un certain temps dans une archive.
Base de sauvegarde \ système \ complet - crée une copie de sauvegarde de la base de données, des fichiers d'application, fait les deux.
Copier les utilitaires - copie toutes sortes de scripts différents sur le serveur.
Mots de passe Peep - vous permet de forcer le mot de passe administrateur.
Vérifier les mises à jour - indique quels fichiers de mise à jour sont téléchargés sur le serveur.
Créer un tunnel - transfère le port d'application du serveur d'applications à UpS (nous avons ssh après tout). Vous pouvez vous connecter directement au port d'application. Utile pour vérifier la fonctionnalité en cas de manque d'accès (http \ s) à l'adresse principale.
Les commandes Infos système , Vérifier l'intégrité , Vérifier la conf. , Vérifier les journaux , Mots de passe Peep , Vérifier les mises à jour et Créer un tunnel ont des analogues «rapides» directement sur le panneau de chaque serveur.
Il y a un lien Historique dans le panneau supérieur, le résultat de toutes (presque) l'exécution des commandes est enregistré dans l'historique. Les permishers sont tenus d'afficher l'historique et d'exécuter des commandes. Les Permichons sont suspendus par le panneau d'administration Dzhangovsky standard. La seule chose que j'ai ajoutée ici, j'ai vissé la bibliothèque django-guardian, qui vous permet d'attacher des permichons à des objets, cela m'a semblé très pratique, mais les djanga ne peuvent pas le faire hors de la boîte.

Bien sûr, je ne suis pas un wi gourou, mais j'ai essayé de rendre la gestion facile et non forcée) Cliquez sur les objets nécessaires, sélectionnez l'équipe et oh c'est tout. Cliquez sur le bouton pour obtenir le résultat. Quelque chose comme ça.


Quelques mots sur la façon dont tout cela fonctionne. Python et dzhanga, comme je l'ai dit, vues, modèles, URL, formulaires, c'est tout ce qu'il y a un tel fichier commands.py . Les fichiers disponibles sont décrits dans ce fichier (jusqu'à présent, tout est logique, non?). Cela ressemble à ceci:
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 

Et toutes les commandes existantes sont décrites dans le dictionnaire commandick . Le nom du dictionnaire est une sorte de jeu sur les mots commande (commande) et dictionnaire (dictionnaire), les connaisseurs d'anglais trouveront probablement une autre signification cachée. Dictionnaire:
 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, ), } 

Chaque commande est un module distinct dans le dossier modules . Les commandes sont lancées par un processus distinct, si plusieurs serveurs sont sélectionnés, puis un script starter.py est créé pour chacun, il importe et exécute le module souhaité (commande). Avez-vous trouvé une nouvelle fonctionnalité? Ajoutez le fichier dans le dossier des modules et décrivez-le dans le dictionnaire, oh tout. Voici une application. Commentaires de masse de Vangyu sur la construction de vélos. À votre hauteur ... contes, je voudrais répondre à cela. Pourquoi les gens continuent-ils à faire de nouvelles personnes? Après tout, les gens sont déjà à ... dans une certaine mesure, beaucoup. Parce que j'aime le processus) Donc j'aime le processus, que je vous souhaite aussi, créer, inventer, essayer)

autres métiers
En conclusion, je veux mentionner quelques autres de mes métiers. Pour le plus petit livre de coloriage . Un script qui simplifie le processus de coloration d'autres 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}"; } # | #--------------------------------------------------------------------+ 

Pour les enfants plus âgés, passer beaucoup de temps dans la console, un joli tableau de bord .
image

Pour ceux qui sont déjà proches de l'hôte local, il existe un script qui crée un menu (boîte de dialogue) à partir de votre ~ / .ssh / config . Tout le monde sait pourquoi ~ / .ssh / config est nécessaire?) Cela ressemble à ceci:
image

Et bien sûr PIE-PIE!
Beaucoup ont aimé Piu-Piu (plus de 550 étoiles sur le github), merci à tous pour vos aimables paroles et pour votre aide! Vous n'avez pas entendu parler de piu-piu? Lisez ici , ici et ici . Je veux développer l'intrigue plus loin et agrandir le jeu, j'ai des idées d'optimisation mais il n'y a malheureusement pas assez de temps. Les vacances du Nouvel An sont les bienvenues, j'espère pouvoir travailler sur le jeu. Soit dit en passant, piu-piu peut être installé apt'om:
 sudo apt install -y piu-piu 

image

Bonne année!)

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


All Articles