[PYTHON] Ich habe einen Appdo-Befehl erstellt, um Befehle im Kontext der App auszuführen

Die Vorbereitung von der Anmeldung beim Host bis zur Ausführung von "Rake" in der Ruby on Rails-Anwendung ist zu lang. Kombinieren Sie sie also zu einem Befehl, "Appdo".

Das Problem, das Sie lösen möchten

Wenn Sie Ruby in rbenv oder rvm einfügen, können Sie "ruby" nicht finden, wenn Sie Befehle mit "sudo" oder "cron" ausführen. Nun, Sie sollten jedes Mal "~ / .bashrc" usw. lesen, aber dies erschwert den Befehl. Wenn die Anzahl der Stellen, an denen eine solche Verarbeitung durchgeführt wird, zunimmt, treten wahrscheinlich Korrekturauslassungen auf. Es ist voll.

Wenn Sie eine Ruby on Rails-Anwendung ausführen, können weder "Bundle Exec Rake" noch "Bin / Rails Runner" ohne weitere "cd $ RAILS_ROOT" ausgeführt werden. Infolgedessen werden Betriebsbefehle immer länger und "crontab" und "config / deploy.rb" werden schwierig zu warten. Es ist voll.

** Wie auch immer, derselbe Host bereitet das Gleiche vor, also sollte ich eine solche Einstellung auf dem Host haben **, also habe ich einen solchen Befehl gegeben.

Die Lösung ist appdo

Ich habe einen "appdo" -Befehl erstellt, um Befehle im Kontext einer App auszuführen. pip install Sie können.

pip install appdo

Mit appdo , Rails c, die früher so liefen ...

$ su - web                       #Zuerst anmelden ...
$ cd my-awesome-app              #Da war dieses Verzeichnis
$ cd current                     #Oh, es war unter der Kontrolle von Capistrano
$ export RAILS_ENV=production    #Umgebungsvariablen festlegen
$ export RACK_ENV=production     #(Etwas anderes)
$ bundle exec rails c            #Hoi

Das ist alles was Sie tun müssen.

$ sudo -iu web appdo rails c     #Schienen c in der App des Webbenutzers

Schreiben Sie die Konfigurationsdatei wie unten gezeigt in $ HOME / .appdo.conf. Das Format ist TOML.

# /home/web/.appdo.conf
#
##Wenn Sie sudo ausführen, ist der sudo-Zielbenutzer.appdo.conf gilt

[default]
cd = "~/my-awesome-app/current"
source = ["/etc/profile", "~/.bashrc"]
prefix = "bundle exec"

[default.env]
RAILS_ENV = production
RACK_ENV = production

Wie Sie sehen können, werden "cd" und "source" verwendet, um Umgebungsvariablen festzulegen, und dann lautet der Befehl "bundle exec".

Wenn Sie es jedes Mal tun, ist es kein Job, den Menschen machen sollten. Es macht die Leute glücklicher, es in eine Konfigurationsdatei zu legen und diese Datei bereitzustellen und zu verwalten.

Andere Änderungen

Änderungen in crontab

Wenn es keine Appdo gibt

RAILS_ROOT=/home/web/my-awesome-app/current
BASHRC=/home/web/.bashrc
RAILS_ENV=production

30 3 * * * bash -c "cd $RAILS_ROOT; source $BASHRC; bundle exec rails runner MyAwesomeApp::MyCron.run()"
30 4 * * * bash -c "cd $RAILS_ROOT; source $BASHRC; bundle exec rails runner MyAwesomeApp::MyCron2.run()"
30 5 * * * bash -c "cd $RAILS_ROOT; source $BASHRC; bundle exec rails runner MyAwesomeApp::MyCron3.run()"

Wenn es Appdo gibt

30 3 * * * appdo rails runner MyAwesomeApp::MyCron.run()
30 4 * * * appdo rails runner MyAwesomeApp::MyCron2.run()
30 5 * * * appdo rails runner MyAwesomeApp::MyCron3.run()

Da Umgebungsvariablen nicht festgelegt werden müssen (Appdo absorbiert sie), wird crontab sehr einfach. Sie können sehen, welchen Befehl Sie mit appdo eingeben. Ich kann es sehen

Befehlsänderung in ssh

Wenn es keine Appdo gibt

ssh my.server.example.com sudo -u web bash -c "cd /home/web/my-awesome-app/current; source ~/.bashrc; RAILS_ENV=production bundle exec rake assets:precompile"

Wenn es Appdo gibt

ssh my.server.example.com sudo -iu web appdo rake assets:precompile

Dies ist so einfach wie "Crontab". Die Vereinfachung von ssh hat den großen Vorteil, dass config / deploy.rb vereinfacht wird. Die Trennung ist besser, da Sie keine hostspezifischen Informationen (Pfade, Umgebungsvariablen usw.) in Ihren App-Code einfügen müssen.

Vereinfachung des Verfahrenshandbuchs

Stellen Sie sich vor, alle CDs / Quellen werden aus dem Dokument entfernt Beeindruckend

Die Hostmigration ist einfach

Selbst wenn die App-Pfade unterschiedlich sind oder Ruby eine gemischte Umgebung aus "rvm / rbenv" ist, kann die Konfigurationsdatei auf jedem Host diesen Unterschied absorbieren. Infolgedessen ist die sequentielle Migration möglicherweise viel einfacher, da das Bereitstellungsskript nicht geändert werden muss.

Andere Anwendungsbeispiele

Verwaltung der Serverkonfigurationsdatei

# /root/.appdo.conf

[apache]
cd = "/etc/apache2"

[bind]
cd = "/var/bind/etc/bind"

Es kann zweckmäßig sein, nur das CD-Ziel anzugeben und nur den Verwaltungsbefehl der Einstellungsdatei freizugeben.

# appdo --app=apache -- ls sites-available
# appdo --app=apache -- ln -s sites-available/99-default sites-enabled
# appdo --app=bind -- co -l master/my.example.com
# appdo --app=bind -- vim master/my.example.com
# appdo --app=bind -- ci -u master/my.example.com

Zusammenfassung

Am Ende murmeln

Es ist ein Skript, das ich gerade selbst erstellt habe und das nicht kugelsicher ist, aber ich habe beschlossen, es zuerst zu veröffentlichen und die Spezifikationen zu erfüllen. Wir freuen uns auf Ihre Fehlerberichte und Anfragen.

Ursprünglich habe ich über diesen Befehl "appdo" nachgedacht, weil es stressig war, dass ich "ruby" von "sudo" nicht verwenden konnte, als ich "rvm / rbenv" verwendete. Die Anforderungen an die Infrastruktur ändern sich heutzutage wieder, aber ich denke, es ist besser, den Host so zu gestalten, dass er sich autonom verhält, egal ob Docker, Leibeigener / Konsul oder Autoscaling. Selbst an einem solchen Ort, wenn Sie mit "appdo" so etwas wie eine "Host-Schicht" erstellen und verschiedene Dinge absorbieren können, werden Sie mit weniger Gebrauch Ihres Kopfes zufrieden sein.

Die Python-Implementierung ist der sogenannte erste Prototyping-Typ. Ich habe noch nie ein Paket mit Python erstellt, daher habe ich @ mkouheis bootstrap-py für die Implementierung verwendet. Ich denke, es wäre besser, zu Go zu wechseln, wenn die Anforderungen wie Optionen festgelegt sind.

e? Ist Rust besser? ...

Recommended Posts

Ich habe einen Appdo-Befehl erstellt, um Befehle im Kontext der App auszuführen
Ich habe den Befehl gegeben, einen farbenfrohen Kalender im Terminal anzuzeigen
Ich möchte einen beliebigen Befehl im Befehlsverlauf von Shell belassen
Ich habe ein Programm erstellt, um die Größe einer Datei mit Python zu überprüfen
Ich habe einen Befehl zum Markieren des Tabellenclips gegeben
Ein Memorandum zur Ausführung des Befehls! Sudo magic in Jupyter Notebook
Ich habe einen Befehl zum Generieren eines Kommentars für eine Tabelle in Django eingegeben
Ich habe eine Funktion erstellt, um das Modell von DCGAN zu überprüfen
Ich habe Sie dazu gebracht, Befehle über einen WEB-Browser auszuführen
[Python] Ich habe eine App erstellt, um die feine Sprachunterscheidung von englischen Wörtern zu üben.
Ich habe in Python ein Programm erstellt, das die 1-Minuten-Daten von FX auf eine beliebige Zeit (1 Stunde usw.) ändert.
Ich habe eine App erstellt, um herauszufinden, wie die Mitglieder der Strohhut-Piraten aussehen
[Linux] Ein Befehl zum Abrufen einer Liste der in der Vergangenheit ausgeführten Befehle
Ich möchte eine Liste in der Reihenfolge anderer Listen sortieren
Ich möchte einen Teil der Excel-Zeichenfolge mit Python einfärben
Ich habe einen Fehler beim Abrufen der Hierarchie mit MultiIndex von Pandas gemacht
Ich habe versucht, den Höhenwert von DTM in einem Diagramm anzuzeigen
Ich habe eine Funktion erstellt, um die Bewegung eines zweidimensionalen Arrays (Python) zu sehen.
Ich habe ein Tool erstellt, um die Ausführungszeit von cron zu schätzen (+ PyPI-Debüt)
So übergeben Sie das Ergebnis der Ausführung eines Shell-Befehls in einer Liste in Python
Mit LINEBot habe ich eine Anwendung erstellt, die mich über die "Buszeit" informiert.
Ich möchte einen Lebenszyklus in der Aufgabendefinition von ECS festlegen
Ich möchte eine Liste der WebDAV-Dateien im Modul Anfragen anzeigen
Ich habe ein Tool zum automatischen Sichern der Metadaten der Salesforce-Organisation erstellt
Ich möchte die Ergebnisse von% time, %% time usw. in einem Objekt (Variable) speichern.
Ich habe ein Skript erstellt, das das aktive Fenster mit win32gui von Python aufzeichnet
Wenn ich versuche, den Befehl make von Makefile mit os / exec von golang auszuführen, führen die zweite und nachfolgende Ausführung zu einem Fehler.
So führen Sie einen Befehl mit einem Unterprozess in Python aus
Ich wollte die Anzahl der Zeilen in mehreren Dateien wissen und versuchte, sie mit einem Befehl abzurufen
Ich habe eine Twitter-App erstellt, die die Zeichen der Vorverbindung mit Heroku entschlüsselt (Fehler).
Ich habe einen Befehl gegeben, auf den Start von Django zu warten, bis die Datenbank bereit ist
Ich habe ein Punktbild des Bildes von Irasutoya gemacht. (Teil 1)
Ich habe ein Punktbild des Bildes von Irasutoya gemacht. (Teil 2)
Ich habe ein Tool erstellt, um die Antwortlinks von OpenAI Gym auf einmal zu erhalten
[Für Anfänger] Ich möchte die Anzahl der Lernerfahrungen leicht verständlich erklären.
Ich habe eine Funktion zum Trimmen des Bildes von Python openCV erstellt. Verwenden Sie sie daher bitte.
Ich schrieb einen Test in "Ich habe versucht, die Wahrscheinlichkeit eines Bingospiels mit Python zu simulieren".
Übergeben des Ausführungsergebnisses eines Shell-Befehls in einer Liste in Python (nicht blockierende Version)
Im Python-Befehl zeigt Python auf Python3.8
Ich habe versucht, ein Programm zu erstellen, um die Fehlersuche von Saiseriya zu lösen (Hinweis)
[Linux] Ich habe versucht, die Ressourcenbestätigungsbefehle zusammenzufassen
[sh] Das Speichern der Befehlsausführung führt zu Variablen
So bestimmen Sie die Existenz eines Selenelements in Python
Wie Sie die interne Struktur eines Objekts in Python kennen
Ich habe ein Programm erstellt, das die Fehlersuche in Sekunden löst
So überprüfen Sie die Speichergröße einer Variablen in Python
[Einführung in StyleGAN] Ich habe mit "The Life of a Man" ♬ gespielt
Ich habe den Code geschrieben, um den Brainf * ck-Code in Python zu schreiben
Eine einfache Möglichkeit, einen zuvor ausgeführten Befehl in ipython erneut auszuführen
So überprüfen Sie die Speichergröße eines Wörterbuchs in Python
So geben Sie das Ausgabeergebnis des Linux-Befehls man in eine Datei aus
So ermitteln Sie die Scheitelpunktkoordinaten eines Features in ArcPy
Ich habe versucht, in 3 Jahren 5 Muster der Analysebasis zu erstellen
Ein Befehl zum einfachen Überprüfen der Netzwerkgeschwindigkeit auf der Konsole
Ich habe einen schlaffen Bot gemacht, der mich über die Temperatur informiert
Erstellen Sie eine Funktion, um den Inhalt der Datenbank in Go abzurufen
Ich habe den Befehl worldcup verwendet, um das Ergebnis der Weltmeisterschaft zu überprüfen.
Ich möchte die Bevölkerung jedes Landes der Welt kennenlernen.
[Kaggle] Ich habe mit dem Titanic-Tutorial eine Sammlung von Problemen erstellt