Ohne Ensemble



    Wir haben uns einmal für die Automatisierung unserer Routinearbeitsmomente entschieden. Erstellen Sie ein Ensemble (Ansible) oder ähnliches. Ich bin auf die Seite des Ensembles geklettert, habe nachgesehen, wie es funktioniert ... stellt eine Verbindung zu einem Remote-Server über ssh her und führt einige Skripts aus ... Stop, dachte ich, braucht ein Ensemble das? Ohne das Ensemble kann ich selbst ... allein ... ich kann es! Und damit das nicht nur ich konnte, entschied ich mich, eine Webanwendung zu schreiben. Die Anwendung wurde Update Server genannt und als UpS abgekürzt .

    Vorning! Unter dem Schnitt viele Bilder und ein paar Gifs.

    Ich entschied mich für eine Anwendung mit Hilfe eines Pythons und eines Dschungels. Es gibt genug Spezialisten und "Spezialisten" für dieses und jenes. Daher werde ich nicht anhand der Anzahl der Codezeilen gemessen. Interessierte können sich dort die Geheimnisse ansehen , aber die meisten Teams sind auf unser Projekt spezialisiert. Ich werde nur sagen (und zeigen), welche Funktionalität sich in der Anwendung implementiert hat. Also. Ich habe meinen eigenen Python (Python) mitgenommen, übrigens ist mein Python nicht sehr groß, normal, durchschnittlich 2,7. Er bekam für ihn eine neue (damals) jung 1.10 und begann sie zu verbinden. Und so war es auch. Von oben und unten kam es in jedem Versuch. Und das Ergebnis war so etwas. Aber zu allererst beginnt alles mit einer so einfachen Seite mit einer Beschreibung.





    Durch Klicken auf Jumbotron- Projekte gelangen Sie zur Seite der Projektauswahl.


    Bei der Auswahl eines Projekts gelangen Sie auf die Hauptseite mit einer Liste von Servern, Skripten usw.


    Lass uns zu den Details gehen. In der Anwendung gibt es mehrere Entitäten: Server (Server), Skript (Skript), Aktualisierungspaket (Update), Task in Cron (Cron-Job), Ereignis in der Historie (Ereignis), Projekt (Projekt) und nicht ganz ein Dump (Dump).

    Kleiner lyrischer Exkurs
    Играем с сыном в Titan quest, вернее я играю, а он смотрит) Там из монстров выпадают некие артефакты, в русской версии называющиеся сущностями. Вот в один прекрасный день выпала мне какая-то сущность Ахилеса чего-то там. На картинке что-то другое, но из той же оперы)
    Сын увидел и кричит:
    — пап, гляди суЧность Ахилеса!)

    Die Hauptentität ist das Projekt. Das Projekt hängt Server, Skripte und Updates zusammen. Erstellen Sie Aufgaben in der Krone und Dumps. Objekte sind über die jeweiligen Lesezeichen verteilt. Auf der linken Seite befindet sich ein Menü mit einer Liste von Befehlen. Gehen Sie die Lesezeichen durch. Die ersten Registerkarten.


    Hier sehen wir die verfügbaren Skripte und Server (Server sind auf allen Registerkarten verfügbar, da sie fast immer benötigt werden). Skripte können aus einer Datei geladen oder mit der Schaltfläche Hinzufügen in der Benutzeroberfläche erstellt werden . Es werden SH-, PY-, YML- und SQL-Skripts unterstützt. Der Skriptbereich hat eine Beschreibung ( Beschreibung ), ein Stück Code ( Vorschau ), Autor und Datum. Für SH- und PY-Skripts können Sie Optionen hinzufügen ( Optionsfeld)). Ein Skript (und ein beliebiges anderes Objekt) wird durch Klicken auf einen beliebigen Teil des Bedienfelds (außer den "Schnellschaltflächen") ausgewählt. Klicken Sie auf das Skript (zweiter, dritter usw.), klicken Sie auf den Server (zweiter, dritter usw.) und klicken Sie auf Skript ausführen . Das ausgewählte Skript oder die ausgewählten Skripts werden auf dem ausgewählten Server oder den ausgewählten Servern ausgeführt. Wenn Sie ein Skript "schnell" ausführen müssen, können Sie die Schaltfläche "Schnell" im Skriptfeld verwenden, auf den Server klicken (zweiter, dritter usw.) und auf Ausführen klickendas gewünschte Skript. Beim Schreiben des Artikels gab es Änderungen. Getrennte SQL-Skripts von den übrigen, fügten einen separaten Befehl und eine Berechtigung für die Ausführung von Escules hinzu. Dies ermöglichte es, zum Beispiel nur die Rechte zur Ausführung von Escules zu geben. SH und PY sind viel leistungsfähiger und bieten nahezu unbegrenzte Möglichkeiten. Aber ich habe die Screenshots nicht wiederholt.) Skripte könnten beschränkt sein, fast alles kann von ihnen gemacht werden, aber es war schon schwierig zu stoppen).
    Fahren Sie fort, Service Packs.


    Auf dieser Registerkarte können Sie neue Updates hinzufügen, auf Server kopieren und Updates durchführen.Tatsächlich kann es sich um beliebige Dateien handeln, da in diesem Beispiel eine reguläre TXT-Datei als Testupdate verwendet wird. Sie laden eine Datei auf den Server hoch (meistens ist es zip) und verwenden sie irgendwie mithilfe von Skripten. Updates haben auch eine Beschreibung, Autor, Datum und Größe.
    Als nächstes kommen die Deponien.


    Es zeigt eine Liste der Dateien an, die mit dem Befehl Dump abrufen empfangen oder von einem Computer hier heruntergeladen wurden. Dumps haben keine Beschreibung, nur Name, Größe und Erstellungszeit. Wahrscheinlich nicht nur alle mindestens einmal (zwei, drei) die Nahrungsgrundlage geknallt? Ich habe diese Gelegenheit auf eine neue Ebene gebracht. Dump senden Mit diesem Befehl wird die Serverbasis aus dem ausgewählten Dump erweitert. Spüren Sie die Möglichkeiten? (Hörte das Knistern der Furzlachse) Ja, nichtMit fähigen Händen kann dieser Befehl mit wenigen Klicks ALLE Basen auf ALLEN Servern töten! Deshalb ist die Schaltfläche dieses (und ähnlicher) Befehls rot hinterlegt, sie sollte sehr vorsichtig gedrückt werden. Bei Bulk Dumps ist die Verwendung natürlich problematisch, und für kleine Testbasen ist dies eine sehr praktische Sache. Kron.


    All diese Hässlichkeit kann durch Kroner laufen. Diese Registerkarte zeigt aktive Aufgaben an. Jede Aufgabe hat eine eindeutige Kennung ( crontab id ), die für nachfolgende Manipulationen erforderlich ist. Die Beschreibung gibt an, was die Aufgabe tun soll. Führen Sie im Beispiel das Skript test2.sh auf dem Server mit der Adresse jboss @ localhost aus. Die Startzeit der Aufgabe wird im Feld Startdatum angegeben .im Format JJJJ-MM-TT HH: MM Vom Autor und Zeitpunkt der Erstellung angegeben. Sie können die Aufgabe abbrechen, die Zeit ändern, die Aufgabe dauerhaft machen (wird jeden Tag zu einer bestimmten Zeit ausgeführt) oder einmalig.
    Protokolle laufender Befehle werden hier angezeigt.


    Mit den Protokollen ist nichts zu tun, alles ist bereits erledigt, sitzen und sehen, was passiert ist. Klicken Sie auf die Protokollplatte, um sie in einem separaten Fenster zu öffnen. Wenn mehrere Prozesse ausgeführt werden, wird die Schaltfläche Alle Protokolle angezeigt . Alle Protokolle werden in einem Fenster geöffnet (ich habe vergessen, diesen Screenshot zu erstellen).

    Server Wie gesagt, die Serverliste ist auf allen Lesezeichen verfügbar. Server zeigen eine Adresse ( SSH-Adresse)), Sie können im Format @ user @ schreiben, es ist jedoch besser, ssh-Aliase (~ / .ssh / config) zu verwenden und einige aussagekräftige Namen anzugeben. Die HTTP-Adresse ist eine Anwendungs-URL, die auf dem Server bereitgestellt wird. Das Arbeitsverzeichnis ( Arbeitsordner ) und der Port ( Server-Bindeport ) ist der Ordner, in dem sich die Anwendung befindet, und der Port wird entsprechend geöffnet. Beschreibung, Autor, Datum. In dem Screenshot wurden einige neue Befehle hinzugefügt, die zum Zeitpunkt des Schreibens hinzugefügt wurden: Prop und Full . Wir haben zwei Hauptkonfigurationsdateien, mit deren Hilfe Sie sie bequem bearbeiten können. Der Rest des Teams. Rot zuerst:
    Wartung EIN \ AUS- Aktivieren / Deaktivieren der Seite "Routine-Wartungsarbeiten" für den Zeitpunkt der Wartungsarbeiten oder wenn etwas schiefgelaufen ist ( z. B. nach dem Senden eines Dumps ).
    Konfiguration neu laden - lädt jboss config neu (unser Projekt verwendet jboss).
    Neustart \ start \ stop \ kill jboss - stoppen, starten, jboss und brutaler Mord neu starten, wenn nichts mehr hilft.
    Weitere nützliche Dinge:
    Systeminfo - Zeigt Informationen zum Server an: Speicher, Festplatte, Prozessor, Benutzer, Prozesse.
    Health prüfen - eine schnelle Überprüfung der Leistung der Anwendung, der Anwendungsprozess wird geprüft, ob der Port geöffnet ist, und versucht, mit einem Vorhang an den Port zu klopfen.
    Check conf - zeigt die Anwendungskonfigurationsdatei.
    Protokolle prüfen - Zeigt die Anwendungsprotokolle an.
    GC-Protokoll prüfen - Zeigt das Protokoll des Protokollsammlers an.
    Tag \ Woche \ Monat \ alle Protokolle abrufen - Mit dieser Option können Sie Protokolle für eine bestimmte Zeit in einem Archiv herunterladen.
    Sicherungsbasis \ system \ full - Erstellt eine Sicherungskopie der Datenbank, Anwendungsdateien, beides.
    Copy utils - Kopiert alle möglichen Skripts auf den Server.
    Peep-Passwörter - Ermöglicht Ihnen, das Admin-Passwort abzurufen.
    Updates prüfen - Zeigt an, welche Update-Dateien auf den Server hochgeladen werden.
    Tunnel erstellen - macht die Portweiterleitung der Anwendung vom Anwendungsserver zum UpS'a (wir haben ssh). Sie können direkt eine Verbindung zum Anwendungsport herstellen. Nützlich für Leistungsprüfungen bei fehlendem Zugriff (http \ s) auf die primäre Adresse.
    Befehl des System der Informationen , die Check Gesundheit , die überprüfen Sie die conf , die Check - Logs Ordner , Peep Passwörter , die nach Updates und erstellen Tunnel haben einen „schnellen“ Analoga direkt auf jedem des Servers.
    Die obere Platte hat einen Link GeschichteHistorie zeichnet das Ergebnis der Ausführung aller (fast) Befehle auf. Permishons sind erforderlich, um den Verlauf anzuzeigen und Befehle auszuführen. Permishons werden von einem Standard-Jung-Admin-Panel aufgehängt. Das einzige, was ich hier hinzugefügt habe, ist, dass ich die Jango-Guardian-Bibliothek aufgeschraubt habe, die es Ihnen erlaubt, Permishons an Objekte zu hängen. Das erschien mir sehr praktisch, und Junga weiß nicht, wie es aus der Box geht.

    Natürlich bin ich nicht der Guru, aber ich habe versucht, das Management einfach und nicht gezwungen zu machen.) Wir quälen die notwendigen Gegenstände, wählen das Team aus und oh, alles. Klicken Sie auf die Schaltfläche, um das Ergebnis zu erhalten. Irgendwie so.


    Ein paar Worte dazu, wie alles funktioniert. Python, Django, wie gesagt, vyuvs, Models, Urls, FORMEN, hier ist alles, und es gibt eine solche Datei commands.py. Diese Datei beschreibt die verfügbaren Befehle (solange alles logisch ist, oder?). Es sieht ungefähr so ​​aus:
    classCommandClass:"""Класс команды"""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

    Alle vorhandenen Befehle werden im Commandick- Wörterbuch beschrieben . Der Name des Wörterbuchs ist eine Art Wordplay-Befehl (Befehl) und Wörterbuch (Wörterbuch). Experten in Englisch werden wahrscheinlich mehr versteckte Bedeutung finden. Wörterbuch:
    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,
    	),
    }

    Jedes Team ist ein separates Modul in dem Verzeichnis der Module . Befehle werden von einem separaten Prozess gestartet. Wenn mehrere Server ausgewählt werden, erstellt jeder Server sein eigenes Starter.py- Skript , importiert und führt das erforderliche Modul (Befehl) aus. Eine neue Funktion erfunden? Sie fügen eine Datei zum Modulordner hinzu und beschreiben sie im Wörterbuch, oh, alles. Hier ist eine Anwendung. Vanguyu Mass Kommentare zum Radfahren. Ich würde gerne Ihre hohen Geschichten beantworten ... Warum machen die Leute immer neue Leute? Immerhin gibt es schon so viele Menschen ... zu einem gewissen Grad. Weil der Prozess wie folgt ist: Also ich mag den Prozess, den ich für dich wünsche, erschaffe, erfinde, versuche

    andere handwerke
    В заключение хочу упомянуть еще парочку своих поделок. Для самых маленьких раскраска. Скриптик упрощающий процесс раскрашивания других скриптиков:
    #--------------------------------------------------------------------+#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

    Для тех, кому уже тесно в рамках локалхоста, есть скриптик, создающий меню(dialog) из вашего ~/.ssh/config. Все знают, зачем нужен ~/.ssh/config?) Выглядит это так:
    image

    И конечно же ПИУ-ПИУ!
    Пиу-пиу многим понравилась(больше 550 звезд на гитхабе), спасибо всем за добрые слова и за помощь! Не слышали про пиу-пиу? Скорей читайте тут, тут и тут. Хочу развить сюжет дальше и сделать игру больше, есть идеи по оптимизации но катастрофически не хватает времени. Новогодние праздники как нельзя кстати, надеюсь получится поработать над игрой. Кстати, пиу-пиу можно установить apt'ом:
    sudo apt install -y piu-piu

    image

    С наступающим!)

    Jetzt auch beliebt: