Verwenden von Chef-Solo zum Konfigurieren einer Django-App unter Ubuntu

Es gibt viele Möglichkeiten, den Prozess des Einrichtens und Konfigurierens einer Box zu automatisieren. Wenn unser gesamtes System zu diesem Zeitpunkt nur aus einer einzigen Box besteht, ist die Einrichtung einer vollständigen SCM-Infrastruktur (Software Configuration Management) aus irgendeinem Grund zu viel des Guten. Shell-Skripte sind eine Option, aber wir könnten auch eine abgespeckte Version von SCM verwenden, die in einigen der verfügbaren Tools verfügbar ist. Chef ist eine der beliebtesten Optionen und "Chef-Solo" ist der eigenständige Konfigurationsmodus von Chef, in dem kein zusätzlicher Knoten als "Chef-Server" erforderlich ist. Alles, was es braucht, ist eine URL oder ein Pfad zu einem Tarball-Paket, das Kochbücher für Köche enthält. Im Vergleich zu Shell-Skripten ist diese Art von Ansatz sofort deklarativer und effizienter und bietet auch eine gute Einführung für den Einstieg in SCMs oder IaC-Prozesse (Infrastructure as Code).

Einige weitere Vorteile der Verwendung von Chef-Solo:

  • Zusammensetzbarkeit: Verwenden Sie die Community-Kochbücher aus dem Kochsupermarkt oder anderen Orten.
  • Kostenlose und Open Source; lizenziert unter der zulässigen Apache 2.0-Lizenz.
  • Zugang zum restlichen Ökosystem des Küchenchefs (InSpec, ChefSpec, Cookstyle, Foodcritic, Chef-Shell usw.)
  • Die Kochbücher und Rezepte können später an einen Client / Server-Modus angepasst werden.

Und einige Nachteile:

  • Einige Community-Kochbücher im Chef-Supermarkt sind veraltet, kaputt und werden nicht gepflegt.
  • Chef-Solo kann Abhängigkeiten nicht alleine lösen.

Die 'Rezepte' in einem 'Kochbuch' des Küchenchefs haben ein rubinbasiertes DSL, das 'Ressourcen' beschreibt, die sich in einem bestimmten Zustand auf einem Knoten befinden. Fahren wir mit einer exemplarischen Vorgehensweise fort, um einige Chef-Konzepte kennenzulernen, die auch für Chef-Solo gelten. Unser Ziel ist es, einen Ubuntu-Knoten einzurichten, auf dem eine Python / Django-Web-App mit Gunicorn und NGINX ausgeführt wird.

Hinweis: ChefDK muss nicht unbedingt auf unserer "Chef Workstation" (unserem Computer) installiert sein. Mit diesem Befehl können wir jedoch die Befehle "chef generate" verwenden, um mit einer Verzeichnisstruktur zum Erstellen von Kochbüchern, Rezepten und mehr zu beginnen. In diesem Artikel wird davon ausgegangen, dass ChefDK auf unserer Workstation installiert ist. Befehle wurden mit der Version 4.7.26-1 von ChefDK ausgeführt.


(Ab diesem Zeitpunkt muss alles, sofern nicht anders angegeben, auf unserer Maschine ausgeführt werden, die auch als "Chef Workstation" bezeichnet wird.)

Kochbuch erstellen

Kochbücher in chef sind wiederverwendbare Einheiten, die alles enthalten, was zur Unterstützung eines Konfigurationsszenarios erforderlich ist. Kochbücher können mehrere "Rezepte" enthalten, und "Rezepte" bestehen hauptsächlich aus Ressourcenmustern. default.rbist das Standardrezept, das ausgeführt wird, wenn auf das Kochbuch in einer Ausführungsliste verwiesen wird . Verschiedene Rezepte ermöglichen die Trennung von Bedenken. In diesem Tutorial fügen wir jedoch alle Ressourcendeklarationen in einer Hauptrezeptdatei hinzu, nämlich der default.rb.

Erstellen Sie einen Ordner mit dem Namen "my-chef-project" und erstellen Sie darin einen Ordner mit dem Namen "cookbooks". Von ./my-chef-project/cookbooks/, laufen Sie:

$ chef generate cookbook my-cookbook

Unsere Verzeichnisstruktur sieht nun folgendermaßen aus:

.
└── my-chef-project
└── cookbooks
└── my-cookbook
├── CHANGELOG.md
├── LICENSE
├── Policyfile.rb
├── README.md
├── chefignore
├── kitchen.yml
├── metadata.rb
├── recipes
│ └── default.rb
├── spec
│ ├── spec_helper.rb
│ └── unit
│ └── recipes
│ └── default_spec.rb
└── test
└── integration
└── default
└── default_test.rb

Pakete hinzufügen

Der erste Schritt zum Einrichten unseres Knotens besteht darin, zu ermitteln, welche Pakete von unserer App benötigt werden. Unser Knoten ist Ubuntu, daher können wir uns auf den APT-Paketmanager verlassen, um die Abhängigkeiten zu erfassen. Die Installation der von der Betriebssystemdistribution bereitgestellten Pakete ist dann ein Kinderspiel:

apt_update
package 'python3'
package 'python3-pip'
package 'nginx'
package 'pkg-config'
package 'libcairo2-dev'
package 'libjpeg-dev'
package 'libgif-dev'
package 'libgirepository1.0-dev'

Diese sind ziemlich selbsterklärend. In der ersten Zeile wird das apt-Repository aktualisiert, und in den folgenden Zeilen werden diese Pakete installiert.

Hinweis: Die Pakete nach 'nginx' werden benötigt, um einige der Python-Abhängigkeiten über pip zu kompilieren. Diese können je nach den in angegebenen Python / Django-Projektabhängigkeiten unterschiedlich sein requirements.txt. Sie können eine Versuchs- und Fehlermethode verwenden, um diese Pakete zu ermitteln, die Sie in Ihr Kochbuch aufnehmen müssen. sudo pip install -r requirements.txtFühren Sie dazu auf einem frisch instanziierten Ubuntu-Computer ein Handbuch durch (Hinweis: Dies installiert Pakete systemweit!), Um festzustellen, ob es erfolgreich ausgeführt wird. Wenn nicht, sollte der stderr Ihnen Hinweise geben, welche Pakete fehlen.

Erstellen von Linux-Benutzern

Sobald wir die erforderlichen Pakete hinzugefügt haben, müssen wir einen nicht privilegierten Linux-Benutzer erstellen, dem der Anwendungsquellcode gehört.

user 'bob' do
  uid 1212
  gid 'users'
  home '/home/bob'
  shell '/bin/bash'
  password '$1$alilbito$C83FsODuq0A1pUMeFPeR10'
end

Beachten Sie, dass das Kennwort ein unter Linux verwendetes Schatten-Hash-Format ist. Es kann mit OpenSSL abgeleitet werden:

$ openssl passwd -1 -salt alilbitof mypassword

Einschließlich der App-Quelle

Nehmen wir nun den Quellcode der Django-Anwendung in unser Kochbuch auf. Platzieren Sie den Quellcode in ./my-chef-project/cookbooks/my-cookbook/files/default/myapp/ Erstellen Sie das ./my-chef-project/cookbooks/my-cookbook/files/defaultVerzeichnis, falls es nicht vorhanden ist.

Die Anweisung zum Kopieren dieser Dateien an einen Remotestandort auf unserem Knoten wird mithilfe der Ressource remote_directory beschrieben :

remote_directory '/home/bob/myapp' do
  source 'myapp' # This is the name of the folder containing our source code that we kept in ./my-cookbook/files/default/
  owner 'bob'
  group 'users'
  mode '0755'
  action :create
end

Ziehen Sie die Python-Abhängigkeiten ein

Um die Python-Pakete in zu installieren requirements.txt, können wir die Ausführungsressource verwenden , um einen beliebigen Befehl auszuführen . In diesem Fall müssen wir den Befehl pip install darüber ausführen:

execute 'install python dependencies' do
  command 'pip3 install -r requirements.txt'
  cwd '/home/bob/myapp'
end

Hinweis: Beachten Sie, dass dies als Root-Benutzer ausgeführt wird und die Python-Bibliotheken systemweit installiert werden. Wenn unser Knoten ausschließlich diese eine einzelne Python-App ausführen soll, ist dies kein großes Problem. Trotzdem ist es eine bessere Option, die Dinge sauber und vernünftig zu halten, ein Community-Kochbuch zu finden und zu verwenden, das Python-Installationen oder 'virtuelle Umgebungen' verwaltet. (oder schreiben Sie zumindest eine Reihe von Ausführungsblöcken , um dies zu replizieren). Durch die Verwendung von virtualenvs in Python wird sichergestellt, dass pythonbasierte Systemtools oder andere Python-Projekte nicht betroffen sind

Gunicorn & NGINX einrichten

Jetzt ist es Zeit, den Gunicorn WSGI HTTP Server mit NGINX als Reverse Proxy vorzubereiten. Nginx wird auch verwendet, um alle statischen Assets von Django zu verwalten.

Um Gunicorn als Dienst unter Ubuntu zu nutzen, kann Systemd verwendet werden. Die Ressource systemd_unit ist seit Version 12.11 in Chef enthalten.

systemd_unit 'gunicorn.service' do
  content({
  Unit: {
    Description: 'Django on Gunicorn',
    After: 'network.target',
  },
  Service: {
    ExecStart: '/usr/local/bin/gunicorn --workers 3 --bind localhost:8080 myapp.wsgi:application',
    User: 'bob',
    Group: 'www-data',
    WorkingDirectory: '/home/bob/myapp'
    Restart: 'always',
  },
  Install: {
    WantedBy: 'multi-user.target',
  }
  })
  action [:create, :enable, :start]
end

Jetzt müssen wir diesem Gunicorn-Server eine Standard-NGINX-Proxy-Konfiguration hinzufügen, wie unten gezeigt. Dieses Snippet kann hineingehen ./my-cookbook/templates/nginx.conf.erb. Erstellen Sie das Vorlagenverzeichnis, falls es nicht vorhanden ist.

Hinweis: Die Vorlagen von Chef unterstützen eingebettete Ruby-Dateien, die Variablen, Ruby-Ausdrücke und Anweisungen enthalten können. Obwohl diese Datei die Erweiterung 'erb' hat, haben wir keine der Ruby-Anweisungen oder -Ausdrücke verwendet. Der Einfachheit halber haben wir hier nur eine Nicht-HTTPS-Nginx-Konfiguration (sanfte Erinnerung; bitte tun Sie dies nicht in der Produktion!)

server {
  listen 80;
  server_name http://example.com/;

  location = /favicon.ico { access_log off; log_not_found off; }
  location /static/ {
    root /home/bob/myapp/myapp/static;
  }

  location / {
  include proxy_params;
    proxy_pass http://localhost:8080/;
  }
}

Hinweis: Es gibt auch eine Alternative und eine bessere Konfiguration, bei der beispielsweise der Gunicorn-Server anstelle einer TCP-Loopback-Verbindung an einen Unix-Domain-Socket gebunden ist. Es lohnt sich, dies aus Leistungsgründen zu untersuchen.

Verwenden Sie die Vorlagenressource von Chef, um diese Konfiguration in einen Site-fähigen Ordner auf dem Knoten zu kopieren .

template '/etc/nginx/sites-available/example.com.conf' do
  source 'nginx.conf.erb'
  owner 'root'
  group 'root'
  mode '0744'
end

Das Aktivieren von Konfigurationen auf nginx erfolgt normalerweise durch Erstellen eines Symlinks, der auf die Konfiguration sites-availableim sites-enabledOrdner von nginx verweist . Symlinks können in Kochbüchern mit der folgenden Link- Ressource deklariert werden:

link '/etc/nginx/sites-enabled/example.com.conf' do
  to '/etc/nginx/sites-available/example.com.conf'
end

und um den Standard-Konfigurationssymlink zu löschen:

link '/etc/nginx/sites-enabled/default' do
  action :delete
end

NGINX starten

Und schließlich, um den Nginx-Service zu starten:

service 'nginx' do
  action :enable
  action :start
end

Runlisten

Run-Listen in Chef sind eine geordnete Liste von Rollen oder Rezepten in einem Kochbuch, die nacheinander auf dem Knoten ausgeführt werden. Wir haben ein Kochbuch "my-cookbook" und das "Standard" -Rezept, das wir auf der Ubuntu-Box ausführen müssen, daher sollte die Datei runlist.json in unserem Projektverzeichnis ( ./my-chef-project/runlist.json) folgendermaßen aussehen:

{
  "run_list": [
    "recipe[my-cookbook::default]"
  ]
}

Letzte Schritte

Unser Kochbuch für Chef Solo ist servierfertig. Es ist Zeit, eine Ubuntu 18.04-Maschine bereitzustellen und ChefDK darauf zu installieren:

$ ssh [email protected] 'apt-get update && yes | apt-get install curl && curl https://packages.chef.io/files/current/chefdk/4.7.45/ubuntu/18.04/chefdk_4.7.45-1_amd64.deb -o chefdk.deb && yes | dpkg -i chefdk.deb && rm chefdk.deb'

Möchten Sie zurück zu unserer Chef - Workstation zu tun, alles , was wir brauchen , ist setzt die Kochbücher Ordner in einem Tarball, Transfer dass Tarball zusammen mit der runlist.jsonan den entfernten Knoten wir oben bereitgestellt und führen Sie den Koch-Solo - Befehl ein :

(Der folgende Befehl muss innerhalb des Knotens oder des 'Chef-Clients' und nicht der Chef-Workstation ausgeführt werden.)

$ chef-solo --recipe-url $(pwd)/chef-solo.tar.gz -j $(pwd)/runlist.json --chef-license=accept

Oder hier ist ein Einzeiler ( ./my-chef-project/Wird von CWD auf der Chef Workstation ausgeführt):

tar zvcf chef-solo.tar.gz ./cookbooks &&\
scp chef-solo.tar.gz runlist.json [email protected]:~/ &&\
ssh [email protected] 'chef-solo --recipe-url $(pwd)/chef-solo.tar.gz -j $(pwd)/runlist.json --chef-license=accept'

Das ist es! Beobachten Sie, wie die Standardausgabe mit Chef-Aktivitäten gefüllt wird, die versuchen, Ihren Knoten auf das zu konvergieren, was Sie in den Kochbüchern angegeben haben. Chef-Solo installiert alle Edelsteine, die für alle Kochbücher erforderlich sind. Wenn der Befehl chef-solo erfolgreich ist, wird eine funktionierende Django-Anwendung hinter nginx auf der Ubuntu-Box ausgeführt. Navigieren Sie zur Domäne / IP, um sie zu testen.

Hinweis: Denken Sie daran, dass Sie in Django möglicherweise diese Domain / IP in der ALLOWED_HOSTSListe in festlegen müssen settings.py.

Auf Änderungen reagieren

Wenn wir den Inhalt unseres Projektverzeichnisses ändern (Rezepte, Vorlagen oder den Quellcode der Anwendung usw.), führen Sie einfach den obigen Einzeiler aus dem Projektverzeichnis aus.

Tipp: Wenn das Kochbuch mit git versioniert ist (wie es sollte), ist es eine gute Empfehlung, Git-Hooks zu setzen, um diesen Einzeiler auszuführen.

Hosting des Tarballs (optional)

Wenn Sie sich den letzten Befehl von chef-solo genau ansehen, beachten Sie, dass der Befehl --recipe-urleine URL annehmen soll. Dies bedeutet, dass Sie einen Workflow haben können, in dem ein CI Ihren Chef-Solo-Tarball erstellt, ihn irgendwo hochlädt und Ihren Knoten so konfiguriert, dass er regelmäßig daraus gezogen wird.

Tipp: Verwenden Sie Curl, um den geänderten Tarball regelmäßig als Cronjob zu ziehen. curl -z $fileberücksichtigt If-Modified-SinceHeader und lädt den Teerball nur herunter, wenn die Remote-Datei seit dem Zeitstempel auf dem vorhandenen lokalen geändert wurde $file.



Leave a Comment

Kann KI mit zunehmender Anzahl von Ransomware-Angriffen kämpfen?

Kann KI mit zunehmender Anzahl von Ransomware-Angriffen kämpfen?

Ransomware-Angriffe nehmen zu, aber kann KI helfen, den neuesten Computervirus zu bekämpfen? Ist KI die Antwort? Lesen Sie hier, ob KI boone oder bane ist

ReactOS: Ist das die Zukunft von Windows?

ReactOS: Ist das die Zukunft von Windows?

ReactOS, ein quelloffenes und kostenloses Betriebssystem, ist hier mit der neuesten Version. Kann es den Anforderungen moderner Windows-Benutzer genügen und Microsoft zu Fall bringen? Lassen Sie uns mehr über dieses alte, aber neuere Betriebssystem erfahren.

Bleiben Sie in Verbindung über die WhatsApp Desktop App 24*7

Bleiben Sie in Verbindung über die WhatsApp Desktop App 24*7

Whatsapp hat endlich die Desktop-App für Mac- und Windows-Benutzer auf den Markt gebracht. Jetzt können Sie ganz einfach von Windows oder Mac auf WhatsApp zugreifen. Verfügbar für Windows 8+ und Mac OS 10.9+

Wie kann KI die Prozessautomatisierung auf die nächste Stufe heben?

Wie kann KI die Prozessautomatisierung auf die nächste Stufe heben?

Lesen Sie dies, um zu erfahren, wie Künstliche Intelligenz bei kleinen Unternehmen beliebt wird und wie sie die Wahrscheinlichkeit erhöht, sie wachsen zu lassen und ihren Konkurrenten einen Vorsprung zu verschaffen.

macOS Catalina 10.15.4 Supplement Update verursacht mehr Probleme als sie zu lösen

macOS Catalina 10.15.4 Supplement Update verursacht mehr Probleme als sie zu lösen

Vor kurzem hat Apple macOS Catalina 10.15.4 als Ergänzungsupdate veröffentlicht, um Probleme zu beheben, aber es scheint, dass das Update mehr Probleme verursacht, die zum Bricking von Mac-Computern führen. Lesen Sie diesen Artikel, um mehr zu erfahren

13 Tools zur kommerziellen Datenextraktion von Big Data

13 Tools zur kommerziellen Datenextraktion von Big Data

13 Tools zur kommerziellen Datenextraktion von Big Data

Was ist ein Journaling-Dateisystem und wie funktioniert es?

Was ist ein Journaling-Dateisystem und wie funktioniert es?

Unser Computer speichert alle Daten in einer organisierten Weise, die als Journaling-Dateisystem bekannt ist. Es ist eine effiziente Methode, die es dem Computer ermöglicht, Dateien zu suchen und anzuzeigen, sobald Sie auf die Suche klicken.https://wethegeek.com/?p=94116&preview=true

Technologische Singularität: Eine ferne Zukunft der menschlichen Zivilisation?

Technologische Singularität: Eine ferne Zukunft der menschlichen Zivilisation?

Da sich die Wissenschaft schnell weiterentwickelt und einen Großteil unserer Bemühungen übernimmt, steigt auch das Risiko, uns einer unerklärlichen Singularität auszusetzen. Lesen Sie, was Singularität für uns bedeuten könnte.

Ein Einblick in 26 Big-Data-Analysetechniken: Teil 1

Ein Einblick in 26 Big-Data-Analysetechniken: Teil 1

Ein Einblick in 26 Big-Data-Analysetechniken: Teil 1

Der Einfluss künstlicher Intelligenz im Gesundheitswesen 2021

Der Einfluss künstlicher Intelligenz im Gesundheitswesen 2021

KI im Gesundheitswesen hat in den letzten Jahrzehnten große Fortschritte gemacht. Somit wächst die Zukunft der KI im Gesundheitswesen immer noch von Tag zu Tag.