Bereitstellen einer erweiterten PHP-Anwendung mit Ansible unter Ubuntu 14.04

Einführung

Dieses Tutorial ist das zweite in einer Reihe über die Bereitstellung von PHP-Anwendungen mit Ansible unter Ubuntu 14.04. Das https://www.digitalocean.com/community/tutorials/how-to-deploy-a-basic-php-application- using-ansible-on-ubuntu-14-04[first tutorial] behandelt die grundlegenden Schritte für die Bereitstellung eine Anwendung und ist ein Ausgangspunkt für die in diesem Lernprogramm beschriebenen Schritte.

In diesem Tutorial werden wir das Einrichten von SSH-Schlüsseln zur Unterstützung von Code-Deployment- / Publishing-Tools, das Konfigurieren der System-Firewall, das Bereitstellen und Konfigurieren der Datenbank (einschließlich des Kennworts!) Sowie das Einrichten von Task-Schedulern (Crons) und Queue-Daemons behandeln. Das Ziel am Ende dieses Tutorials ist es, dass Sie einen voll funktionsfähigen PHP-Anwendungsserver mit der oben genannten erweiterten Konfiguration haben.

Wie im letzten Tutorial verwenden wir das Laravel framework als Beispiel für eine PHP-Anwendung. Diese Anweisungen können jedoch leicht geändert werden, um andere Frameworks und Anwendungen zu unterstützen, wenn Sie bereits über eigene verfügen.

Voraussetzungen

Dieses Tutorial folgt direkt ab dem Ende von https://www.digitalocean.com/community/tutorials/how-to-deploy-a-basic-php-application- using-ansible-on-ubuntu-14-04[the Erstes Lernprogramm der Serie] und alle für dieses Lernprogramm generierten Konfigurationen und Dateien sind erforderlich. Wenn Sie dieses Tutorial noch nicht abgeschlossen haben, tun Sie dies bitte zuerst, bevor Sie mit diesem Tutorial fortfahren.

Schritt 1 - Wechseln des Anwendungsrepositorys

In diesem Schritt aktualisieren wir das Git-Repository auf ein leicht angepasstes Beispiel-Repository.

Da für die Laravel-Standardinstallation nicht die erweiterten Funktionen erforderlich sind, die wir in diesem Lernprogramm einrichten werden, wird das vorhandene Repository vom Standard-Repository auf ein Beispiel-Repository mit hinzugefügtem Debugging-Code umgestellt, um zu zeigen, wann die Dinge funktionieren . Das Repository, das wir verwenden werden, befindet sich unter + https://github.com/do-community/do-ansible-adv-php +.

Wenn Sie dies noch nicht getan haben, ändern Sie die Verzeichnisse aus dem vorherigen Tutorial in "+ ansible-php +".

cd ~/ansible-php/

Öffne unser vorhandenes Playbook zur Bearbeitung.

nano php.yml

Suchen und aktualisieren Sie die Aufgabe "Clone git repository", damit sie so aussieht.

Aktualisierte Ansible-Aufgabe

- name: Clone git repository
 git: >
   dest=/var/www/laravel
   repo=
   update=

 sudo: yes
 sudo_user: www-data
 register: cloned

Speichern Sie das Playbook und führen Sie es aus.

ansible-playbook php.yml --ask-sudo-pass

Besuchen Sie nach Abschluss der Ausführung Ihren Server in Ihrem Webbrowser (d. H. + http: /// +). Es sollte eine Meldung angezeigt werden, die besagt, dass der Treiber nicht gefunden werden konnte.

Dies bedeutet, dass wir das Standard-Repository erfolgreich gegen unser Beispiel-Repository ausgetauscht haben, die Anwendung jedoch keine Verbindung zur Datenbank herstellen kann. Dies ist, was wir hier erwarten, und wir werden die Datenbank später im Tutorial installieren und einrichten.

Schritt 2 - Einrichten von SSH-Schlüsseln für die Bereitstellung

In diesem Schritt richten wir SSH-Schlüssel ein, die für Anwendungscode-Bereitstellungsskripten verwendet werden können.

Während Ansible sich hervorragend für die Wartung der Konfiguration und das Einrichten von Servern und Anwendungen eignet, werden häufig Tools wie Envoy und Rocketeer verwendet um Codeänderungen auf Ihren Server zu übertragen und Anwendungsbefehle remote auszuführen. Für die meisten dieser Tools ist eine SSH-Verbindung erforderlich, über die direkt auf die Anwendungsinstallation zugegriffen werden kann. In unserem Fall bedeutet dies, dass wir SSH-Schlüssel für den Benutzer "+ www-data" konfigurieren müssen.

Wir benötigen die öffentliche Schlüsseldatei für den Benutzer, von dem Sie Ihren Code senden möchten. Diese Datei befindet sich normalerweise unter + ~ / .ssh / id_rsa.pub +. Kopieren Sie diese Datei in das Verzeichnis "+ ansible-php +".

cp ~/.ssh/id_rsa.pub ~/ansible-php/deploykey.pub

Wir können das Ansible-Modul "+ authorized_key " verwenden, um unseren öffentlichen Schlüssel in " / var / www / .ssh / authorized_keys " zu installieren, wodurch die Bereitstellungstools eine Verbindung herstellen und auf unsere Anwendung zugreifen können. Die Konfiguration muss nur mithilfe einer Suche wissen, wo sich der Schlüssel befindet, und der Benutzer, für den der Schlüssel installiert werden muss (in unserem Fall " www-data +").

Neue Ansible-Aufgabe

- name: Copy public key into /var/www
 authorized_key: user=www-data key="{{ lookup('file', 'deploykey.pub') }}"

Wir müssen auch die "+ www-data" -Benutzershell setzen, damit wir uns tatsächlich anmelden können. Andernfalls lässt SSH die Verbindung zu, dem Benutzer wird jedoch keine Shell angezeigt. Dies kann mit dem '+ user'-Modul geschehen und die Shell auf' + / bin / bash '(oder Ihre bevorzugte Shell) setzen.

Neue Ansible-Aufgabe

- name: Set www-data user shell
 user: name=www-data shell=/bin/bash

Öffnen Sie nun das Playbook zum Bearbeiten, um die neuen Aufgaben hinzuzufügen.

nano php.yml

Fügen Sie die obigen Aufgaben zu Ihrem "+ php.yml +" - Playbook hinzu. Das Ende der Datei sollte mit dem folgenden übereinstimmen. Die Ergänzungen sind rot hervorgehoben.

Aktualisierte php.yml

. . .

 - name: Configure nginx
   template: src=nginx.conf dest=/etc/nginx/sites-available/default
   notify:
     - restart php5-fpm
     - restart nginx







 handlers:

. . .

Speichern Sie das Playbook und führen Sie es aus.

ansible-playbook php.yml --ask-sudo-pass

Wenn Ansible fertig ist, sollten Sie in der Lage sein, SSH mit dem Benutzer "+ www-data" auszuführen.

ssh www-data@

Wenn Sie sich erfolgreich anmelden, funktioniert es! Sie können sich jetzt wieder abmelden, indem Sie "+ Abmelden +" eingeben oder * STRG + D * drücken.

Diese Verbindung muss in diesem Lernprogramm nicht für andere Schritte verwendet werden. Sie ist jedoch hilfreich, wenn Sie andere Tools wie oben beschrieben einrichten oder das allgemeine Debugging und die Anwendungswartung nach Bedarf durchführen.

Schritt 3 - Konfigurieren der Firewall

In diesem Schritt konfigurieren wir die Firewall auf dem Server so, dass nur Verbindungen für HTTP und SSH zugelassen werden.

In Ubuntu 14.04 ist UFW (Uncomplicated Firewall) standardmäßig installiert, und Ansible unterstützt es mit dem + ufw + - Modul. Es verfügt über eine Reihe leistungsstarker Funktionen und wurde so einfach wie möglich gestaltet. Es eignet sich perfekt für eigenständige Webserver, für die nur ein paar Ports geöffnet sein müssen. In unserem Fall möchten wir, dass Port 80 (HTTP) und Port 22 (SSH) geöffnet sind. Möglicherweise möchten Sie auch Port 443 für HTTPS.

Das + ufw + Modul hat eine Reihe von verschiedenen Optionen, die unterschiedliche Aufgaben ausführen. Die verschiedenen Aufgaben, die wir ausführen müssen, sind:

  1. Aktivieren Sie UFW und verweigern Sie standardmäßig den gesamten eingehenden Datenverkehr.

  2. Öffnen Sie den SSH-Port, aber beschränken Sie die Geschwindigkeit, um Brute-Force-Angriffe zu verhindern.

  3. Öffnen Sie den HTTP-Port.

Dies kann jeweils mit den folgenden Aufgaben durchgeführt werden.

Neue Ansible-Aufgaben

- name: Enable UFW
 ufw: direction=incoming policy=deny state=enabled

- name: UFW limit SSH
 ufw: rule=limit port=ssh

- name: UFW open HTTP
 ufw: rule=allow port=http

Öffnen Sie wie zuvor die Datei "+ php.yml +" zum Bearbeiten.

nano php.yml

Fügen Sie die obigen Aufgaben zum Playbook hinzu. Das Ende der Datei sollte mit dem folgenden übereinstimmen.

Aktualisierte php.yml

. . .

 - name: Copy public key into /var/www
   authorized_key: user=www-data key="{{ lookup('file', 'deploykey.pub') }}"

 - name: Set www-data user shell
   user: name=www-data shell=/bin/bash










 handlers:

. . .

Speichern Sie das Playbook und führen Sie es aus.

ansible-playbook php.yml --ask-sudo-pass

Wenn dies erfolgreich abgeschlossen wurde, sollten Sie weiterhin in der Lage sein, über SSH (mit Ansible) oder HTTP eine Verbindung zu Ihrem Server herzustellen. andere Ports werden nun gesperrt.

Sie können den Status von UFW jederzeit überprüfen, indem Sie diesen Befehl ausführen:

ansible php --sudo --ask-sudo-pass -m shell -a "ufw status verbose"

Aufschlüsselung des Ansible-Befehls oben:

  • + ansible: Führt eine unformatierte Ansible-Aufgabe ohne ein Playbook aus.

  • + php: Führe die Aufgabe gegen die Hosts in dieser Gruppe aus.

  • + - sudo: Führen Sie den Befehl als` + sudo` aus.

  • + - ask-sudo-pass +: Nach dem + sudo + Passwort fragen.

  • + -m shell: Führe das` + shell` Modul aus.

  • + -a" ufw status verbose "+: Die Optionen, die an das Modul übergeben werden sollen. Da es sich um ein "+ shell " - Kommando handelt, übergeben wir das RAW-Kommando (d. H. ` ufw status verbose`) ohne irgendwelche` + key = value` Optionen.

Es sollte so etwas zurückgeben.

UFW-Statusausgabe

| success | rc=0 >>
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
22                         LIMIT IN    Anywhere
80                         ALLOW IN    Anywhere
22 (v6)                    LIMIT IN    Anywhere (v6)
80 (v6)                    ALLOW IN    Anywhere (v6)

Schritt 4 - Installieren der MySQL-Pakete

In diesem Schritt richten wir eine MySQL-Datenbank für unsere Anwendung ein.

Der erste Schritt besteht darin, sicherzustellen, dass MySQL auf unserem Server installiert ist, indem Sie einfach die erforderlichen Pakete zur Aufgabe "Installationspakete" oben in unserem Playbook hinzufügen. Die Pakete, die wir benötigen, sind "+ mysql-server", "+ mysql-client" und "+ php5-mysql". Wir werden auch + python-mysqldb + brauchen, damit Ansible mit MySQL kommunizieren kann.

Während wir Pakete hinzufügen, müssen wir + nginx + und + php5-fpm + neu starten, um sicherzustellen, dass die neuen Pakete von der Anwendung verwendet werden können. In diesem Fall muss MySQL für PHP verfügbar sein, damit eine Verbindung zur Datenbank hergestellt werden kann.

Eines der fantastischen Dinge an Ansible ist, dass Sie alle Aufgaben ändern und Ihr Playbook erneut ausführen können und die Änderungen übernommen werden. Dies schließt Listen von Optionen ein, wie wir sie bei der Aufgabe "+ apt +" haben.

Öffnen Sie wie zuvor die Datei "+ php.yml +" zum Bearbeiten.

nano php.yml

Suchen Sie die Aufgabe + install packages + und aktualisieren Sie sie, um die oben genannten Pakete einzuschließen:

Aktualisierte php.yml

. . .

- name: install packages
 apt: name={{ item }} update_cache=yes state=latest
 with_items:
   - git
   - mcrypt
   - nginx
   - php5-cli
   - php5-curl
   - php5-fpm
   - php5-intl
   - php5-json
   - php5-mcrypt
   - php5-sqlite
   - sqlite3








. . .

Speichern Sie das Playbook und führen Sie es aus:

ansible-playbook php.yml --ask-sudo-pass

Schritt 5 - Einrichten der MySQL-Datenbank

In diesem Schritt erstellen wir eine MySQL-Datenbank für unsere Anwendung.

Ansible kann direkt mit MySQL unter Verwendung der + mysql_ + -vorbereiteten Module (z. + mysql_db +, + mysql_user +). Das + mysql_db + - Modul bietet eine Möglichkeit, sicherzustellen, dass eine Datenbank mit einem bestimmten Namen vorhanden ist, sodass wir eine solche Aufgabe zum Erstellen der Datenbank verwenden können.

Neue Ansible-Aufgabe

- name: Create MySQL DB
 mysql_db: name=laravel state=present

Wir benötigen außerdem ein gültiges Benutzerkonto mit einem bekannten Kennwort, damit unsere Anwendung eine Verbindung zur Datenbank herstellen kann. Eine Möglichkeit besteht darin, ein Kennwort lokal zu generieren und in unserem Ansible-Wiedergabebuch zu speichern. Dies ist jedoch unsicher und es gibt einen besseren Weg.

Wir generieren das Passwort mit Ansible auf dem Server selbst und verwenden es direkt dort, wo es benötigt wird. Um ein Passwort zu generieren, verwenden wir das Kommandozeilen-Tool + makepasswd + und fragen nach einem 32-stelligen Passwort. Da + makepasswd + unter Ubuntu nicht standardmäßig ist, müssen wir das auch der Paketliste hinzufügen.

Wir werden Ansible auch anweisen, sich die Ausgabe des Befehls zu merken (d. H. das Passwort), damit wir es später in unserem Spielbuch verwenden können. Da Ansible jedoch nicht weiß, ob bereits ein "+ shell +" - Befehl ausgeführt wurde, erstellen wir auch eine Datei, wenn wir diesen Befehl ausführen. Ansible prüft, ob die Datei vorhanden ist. In diesem Fall wird davon ausgegangen, dass der Befehl bereits ausgeführt wurde, und wird ihn nicht erneut ausführen.

Die Aufgabe sieht folgendermaßen aus:

Neue Ansible-Aufgabe

- name: Generate DB password
 shell: makepasswd --chars=32
 args:
   creates: /var/www/laravel/.dbpw
 register: dbpwd

Als Nächstes müssen wir den tatsächlichen MySQL-Datenbankbenutzer mit dem von uns angegebenen Kennwort erstellen. Dies geschieht mit dem + mysql_user + -Modul, und wir können die Option + stdout + für die Variable verwenden, die wir während der Aufgabe zur Kennwortgenerierung definiert haben, um die unformatierte Ausgabe des Shell-Befehls abzurufen: + dbpwd.stdout + .

Der Befehl + mysql_user + akzeptiert den Namen des Benutzers und die erforderlichen Berechtigungen. In unserem Fall möchten wir einen Benutzer mit dem Namen "+ laravel " erstellen und ihm alle Berechtigungen für die Tabelle " laravel " erteilen. Wir müssen der Task auch mitteilen, dass sie nur ausgeführt werden soll, wenn die Variable ` dbpwd +` changed hat, was nur der Fall ist, wenn die Task zur Kennwortgenerierung ausgeführt wird.

Die Aufgabe sollte folgendermaßen aussehen:

Neue Ansible-Aufgabe

- name: Create MySQL User
 mysql_user: name=laravel password={{ dbpwd.stdout }} priv=laravel.*:ALL state=present
 when: dbpwd.changed

Öffnen Sie dazu die Datei "+ php.yml +" zum Bearbeiten, damit wir die obigen Aufgaben hinzufügen können.

nano php.yml

Suchen Sie zunächst die Aufgabe "+ install packages " und aktualisieren Sie sie mit dem Paket " makepasswd +".

Aktualisierte php.yml

. . .

- name: install packages
 apt: name={{ item }} update_cache=yes state=latest
 with_items:
   - git
   - mcrypt
   - nginx
   - php5-cli
   - php5-curl
   - php5-fpm
   - php5-intl
   - php5-json
   - php5-mcrypt
   - php5-sqlite
   - sqlite3
   - mysql-server
   - mysql-client
   - php5-mysql
   - python-mysqldb

 notify:
   - restart php5-fpm
   - restart nginx

. . .

Fügen Sie dann unten die Aufgaben zur Kennwortgenerierung, MySQL-Datenbankerstellung und Benutzererstellung hinzu.

Aktualisierte php.yml

. . .

 - name: UFW limit SSH
   ufw: rule=limit port=ssh

 - name: UFW open HTTP
   ufw: rule=allow port=http














 handlers:

. . .
  • Führen Sie das Playbook noch nicht aus! * Möglicherweise haben Sie bemerkt, dass wir den MySQL-Benutzer und die MySQL-Datenbank zwar erstellt haben, aber mit dem Kennwort noch nichts getan haben. Wir werden das im nächsten Schritt behandeln. Wenn Sie in Ansible "+ shell +" - Aufgaben verwenden, müssen Sie immer daran denken, den gesamten Workflow, der sich mit den Ausgaben / Ergebnissen der Aufgabe befasst, abzuschließen, bevor Sie sie ausführen, um zu vermeiden, dass Sie sich manuell anmelden und den Status zurücksetzen müssen.

Schritt 6 - Konfigurieren der PHP-Anwendung für die Datenbank

In diesem Schritt speichern wir das MySQL-Datenbankkennwort in der Datei "+ .env +" für die Anwendung.

Wie im letzten Tutorial werden wir die Datei "+ .env " aktualisieren, um unsere neu erstellten Datenbankanmeldeinformationen einzuschließen. Standardmäßig enthält Laravels ` .env +` Datei folgende Zeilen:

Laravel .env Datei

DB_HOST=localhost
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret

Wir können die Zeile "+ DB_HOST " unverändert lassen, aktualisieren aber die anderen drei mit den folgenden Tasks, die den Tasks, die wir im vorherigen Tutorial zum Festlegen von " APP_ENV " und " APP_DEBUG +" verwendet haben, sehr ähnlich sind.

Neue Ansible-Aufgaben

- name: set DB_DATABASE
 lineinfile: dest=/var/www/laravel/.env regexp='^DB_DATABASE=' line=DB_DATABASE=laravel

- name: set DB_USERNAME
 lineinfile: dest=/var/www/laravel/.env regexp='^DB_USERNAME=' line=DB_USERNAME=laravel

- name: set DB_PASSWORD
 lineinfile: dest=/var/www/laravel/.env regexp='^DB_PASSWORD=' line=DB_PASSWORD={{ dbpwd.stdout }}
 when: dbpwd.changed

Wie bei der MySQL-Benutzererstellung haben wir die generierte Kennwortvariable (+ dbpwd.stdout +) verwendet, um die Datei mit dem Kennwort zu füllen, und die Option + when + hinzugefügt, um sicherzustellen, dass sie nur ausgeführt wird, wenn ` + dbpwd + `hat sich geändert.

Da die Datei "+ .env " bereits vor dem Hinzufügen unserer Aufgabe zur Kennwortgenerierung vorhanden war, müssen Sie das Kennwort in einer anderen Datei speichern. Die Generierungsaufgabe kann nach der Existenz dieser Datei suchen (die wir bereits in der Aufgabe eingerichtet haben). Wir werden auch die Optionen " sudo " und " sudo_user " verwenden, um Ansible anzuweisen, die Datei als " www-data +" - Benutzer zu erstellen.

Neue Ansible-Aufgabe

- name: Save dbpw file
 lineinfile: dest=/var/www/laravel/.dbpw line="{{ dbpwd.stdout }}" create=yes state=present
 sudo: yes
 sudo_user: www-data
 when: dbpwd.changed

Öffnen Sie die Datei + php.yml + zum Bearbeiten.

nano php.yml

Fügen Sie die obigen Aufgaben zum Playbook hinzu. Das Ende der Datei sollte mit dem folgenden übereinstimmen.

Aktualisierte php.yml

. . .

 - name: Create MySQL User
   mysql_user: name=laravel password={{ dbpwd.stdout }} priv=laravel.*:ALL state=present
   when: dbpwd.changed

















 handlers:

. . .
  • Führen Sie das Playbook noch nicht aus! * Wir müssen noch einen Schritt ausführen, bevor wir das Playbook ausführen können.

Schritt 7 - Migrieren der Datenbank

In diesem Schritt führen wir die Datenbankmigrationen aus, um die Datenbanktabellen einzurichten.

In Laravel geschieht dies durch Ausführen des Befehls "+ migrate " (d. H. ` php artisan migrate --force `) im Laravel-Verzeichnis. Beachten Sie, dass wir das " - force" -Flag hinzugefügt haben, da die "+ production" -Umgebung dies erfordert.

Die Ansible-Aufgabe dazu sieht folgendermaßen aus.

Neue Ansible-Aufgabe

 - name: Run artisan migrate
   shell: php /var/www/laravel/artisan migrate --force
   sudo: yes
   sudo_user: www-data
   when: dbpwd.changed

Jetzt ist es Zeit, unser Spielbuch zu aktualisieren. Öffnen Sie die Datei + php.yml + zum Bearbeiten.

nano php.yml

Fügen Sie die obigen Aufgaben zum Playbook hinzu. Das Ende der Datei sollte mit dem folgenden übereinstimmen.

Aktualisierte php.yml

. . .

 - name: Save dbpw file
   lineinfile: dest=/var/www/laravel/.dbpw line="{{ dbpwd.stdout }}" create=yes   state=present
   sudo: yes
   sudo_user: www-data
   when: dbpwd.changed







 handlers:

. . .

Schließlich können wir das Playbook speichern und ausführen.

ansible-playbook php.yml --ask-sudo-pass

Wenn dies abgeschlossen ist, aktualisieren Sie die Seite in Ihrem Browser und Sie sollten eine Meldung sehen, die besagt:

Ihr_Server_IP / ’> http: ///

Queue: NO
Cron: NO

Dies bedeutet, dass die Datenbank ordnungsgemäß eingerichtet wurde und wie erwartet funktioniert, aber noch keine Cron-Tasks oder Warteschlangendämon eingerichtet wurden.

Schritt 8 - Cron-Aufgaben konfigurieren

In diesem Schritt richten wir alle Cron-Tasks ein, die konfiguriert werden müssen.

Cron-Tasks sind Befehle, die nach einem festgelegten Zeitplan ausgeführt werden und zum Ausführen einer beliebigen Anzahl von Tasks für Ihre Anwendung verwendet werden können, z. B. zum Ausführen von Wartungsaufgaben oder zum Versenden von Updates für E-Mail-Aktivitäten. Cron-Tasks können so häufig wie jede Minute oder so selten ausgeführt werden, wie Sie es benötigen.

Laravel wird mit einem Artisan-Befehl namens "+ schedule: run +" ausgeliefert, der so konzipiert ist, dass er jede Minute ausgeführt wird und die definierten geplanten Aufgaben in der Anwendung ausführt. Dies bedeutet, dass wir nur eine einzige Cron-Aufgabe hinzufügen müssen, wenn unsere Anwendung diese Funktion nutzt.

Ansible hat ein + cron + Modul mit einer Reihe von verschiedenen Optionen, die direkt in die verschiedenen Optionen übersetzt werden, die Sie über cron konfigurieren können:

  • + job +: Der auszuführende Befehl. Erforderlich, wenn state = present.

  • + Minute,` + Stunde`, + Tag,` + Monat` und + Wochentag +: Die Minute, Stunde, der Tag, der Monat oder der Wochentag, an dem der Job ausgeführt werden soll.

  • + special_time + (+ reboot +, + annual,` + alljährlich`, + monatlich +, + wöchentlich +, + daily +, + stündlich): Spezieller Kurzname für die Zeitangabe.

Standardmäßig wird eine Aufgabe erstellt, die jede Minute ausgeführt wird, was wir wollen. Dies bedeutet, dass die gewünschte Aufgabe folgendermaßen aussieht:

Neue Ansible-Aufgabe

- name: Laravel Scheduler
 cron: >
   job="run-one php /var/www/laravel/artisan schedule:run 1>> /dev/null 2>&1"
   state=present
   user=www-data
   name="php artisan schedule:run"

Der Befehl + run-one + ist ein kleiner Helfer in Ubuntu, der sicherstellt, dass der Befehl nur einmal ausgeführt wird. Dies bedeutet, dass ein früherer Befehl "+ schedule: run +", der noch ausgeführt wird, nicht erneut ausgeführt wird. Dies ist hilfreich, um eine Situation zu vermeiden, in der eine Cron-Task in einer Schleife gesperrt wird und mit der Zeit immer mehr Instanzen derselben Task gestartet werden, bis dem Server die Ressourcen ausgehen.

Öffnen Sie wie zuvor die Datei "+ php.yml +" zum Bearbeiten.

nano php.yml

Fügen Sie die obige Aufgabe dem Playbook hinzu. Das Ende der Datei sollte mit dem folgenden übereinstimmen.

Aktualisierte php.yml

. . .

 - name: Run artisan migrate
   shell: php /var/www/laravel/artisan migrate --force
   sudo: yes
   sudo_user: www-data
   when: dbpwd.changed








 handlers:

. . .

Speichern Sie das Playbook und führen Sie es aus:

ansible-playbook php.yml --ask-sudo-pass

Aktualisieren Sie nun die Seite in Ihrem Browser. In einer Minute wird das Update so aussehen.

Ihr_Server_IP / ’> http: ///

Queue: NO
Cron:

Dies bedeutet, dass der Cron im Hintergrund korrekt arbeitet. Als Teil der Beispielanwendung wird jede Minute ein Cron-Job ausgeführt, der einen Statuseintrag in der Datenbank aktualisiert, damit die Anwendung weiß, dass er ausgeführt wird.

Schritt 9 - Konfigurieren des Warteschlangendämons

Wie der Befehl + schedule: run + Artisan aus Schritt 8 enthält Laravel auch einen Warteschlangen-Worker, der mit dem Befehl + queue: work --daemon + Artisan gestartet werden kann. In diesem Schritt konfigurieren wir den Queue Daemon Worker für Laravel.

Warteschlangen-Worker ähneln Cron-Jobs darin, dass sie Aufgaben im Hintergrund ausführen. Der Unterschied besteht darin, dass die Anwendung Jobs entweder über vom Benutzer ausgeführte Aktionen oder über Aufgaben, die über einen Cron-Job geplant wurden, in die Warteschlange schiebt. Warteschlangentasks werden einzeln vom Worker ausgeführt und bei Bedarf verarbeitet, wenn sie in der Warteschlange gefunden werden. Warteschlangentasks werden häufig für Arbeiten verwendet, deren Ausführung einige Zeit in Anspruch nimmt, z. B. das Senden von E-Mails oder das Ausführen von API-Aufrufen an externe Dienste.

Im Gegensatz zum Befehl "+ schedule: run " muss dieser Befehl nicht jede Minute ausgeführt werden. Stattdessen muss es ständig als Daemon im Hintergrund ausgeführt werden. Ein üblicher Weg, dies zu tun, ist die Verwendung eines Pakets eines Drittanbieters wie _supervisord_. Diese Methode setzt jedoch voraus, dass Sie mit der Konfiguration und Verwaltung des Systems vertraut sind. Es gibt eine viel einfachere Möglichkeit, es mit cron und dem Befehl ` run-one +` zu implementieren.

Wir werden einen Cron-Eintrag erstellen, um den Queue-Worker-Daemon zu starten, und ihn mit + run-one + ausführen. Dies bedeutet, dass cron den Prozess beim ersten Ausführen startet und alle nachfolgenden cron-Ausführungen von "+ run-one " ignoriert werden, während der Worker ausgeführt wird. Sobald der Worker anhält, lässt " run-one +" den Befehl erneut ausführen, und der Warteschlangen-Worker wird erneut gestartet. Es ist eine unglaublich einfache und benutzerfreundliche Methode, mit der Sie nicht mehr lernen müssen, wie Sie ein anderes Tool konfigurieren und verwenden.

Vor diesem Hintergrund werden wir eine weitere Cron-Task erstellen, um unseren Warteschlangen-Worker auszuführen.

Neue Ansible-Aufgabe

- name: Laravel Queue Worker
 cron: >
   job="run-one php /var/www/laravel/artisan queue:work --daemon --sleep=30 --delay=60 --tries=3 1>> /dev/null 2>&1"
   state=present
   user=www-data
   name="Laravel Queue Worker"

Öffnen Sie wie zuvor die Datei "+ php.yml +" zum Bearbeiten.

nano php.yml

Fügen Sie die obige Aufgabe dem Playbook hinzu. Das Ende der Datei sollte mit folgendem übereinstimmen:

Aktualisierte php.yml

. . .

 - name: Laravel Scheduler
   cron: >
     job="run-one php /var/www/laravel/artisan schedule:run 1>> /dev/null 2>&1"
     state=present
     user=www-data
     name="php artisan schedule:run"








 handlers:
. . .

Speichern Sie das Playbook und führen Sie es aus:

ansible-playbook php.yml --ask-sudo-pass

Aktualisieren Sie die Seite wie zuvor in Ihrem Browser. Nach einer Minute sieht das Update folgendermaßen aus:

Ihr_Server_IP / ’> http: ///

Queue:
Cron: YES

Dies bedeutet, dass der Warteschlangenarbeiter im Hintergrund ordnungsgemäß arbeitet. Der Cron-Job, den wir im letzten Schritt gestartet haben, schiebt einen Job in die Warteschlange. Dieser Job aktualisiert die Datenbank, wenn er ausgeführt wird, um anzuzeigen, dass er funktioniert.

Wir haben jetzt eine funktionierende Laravel-Beispielanwendung, die funktionierende Cron-Jobs und Queue-Worker enthält.

Fazit

In diesem Lernprogramm wurden einige der fortgeschritteneren Themen behandelt, wenn Ansible zum Bereitstellen von PHP-Anwendungen verwendet wird. Alle verwendeten Aufgaben können leicht an die meisten PHP-Anwendungen angepasst werden (abhängig von deren spezifischen Anforderungen), und es sollte Ihnen einen guten Ausgangspunkt bieten, um Ihre eigenen Playbooks für Ihre Anwendungen einzurichten.

Wir haben im Rahmen dieses Tutorials keinen einzigen SSH-Befehl verwendet (abgesehen von der Überprüfung der "+ www-data +" - Benutzeranmeldung), und alles - einschließlich des MySQL-Benutzerkennworts - wurde automatisch eingerichtet. Nachdem Sie dieses Tutorial durchgearbeitet haben, ist Ihre Anwendung einsatzbereit und unterstützt Tools für Push-Code-Updates.