Tutorial

So installieren und richten Sie WordPress mit LAMP unter Ubuntu 18.04 mithilfe von Ansible ein

PHPWordPressLAMP StackAnsibleAutomated Setups

Einführung

Server-Automatisierung spielt aufgrund der Löschbarkeit von modernen Anwendungsumgebungen eine wesentliche Rolle bei der Systemverwaltung. Konfigurationsverwaltungs-Tools wie Ansible werden üblicherweise verwendet, um den Prozess der automatischen Servereinrichtung zu optimieren, indem Standardverfahren für neue Server festgelegt und menschliche Fehler in Zusammenhang mit manueller Einrichtung reduziert werden.

Ansible bietet eine einfache Architektur, die keiner speziellen Software für die Installation auf Knoten bedarf. Des Weiteren bietet es eine Reihe stabiler Funktionen und integrierter Module, die das Schreiben von Automatisierungsskripts erleichtern.

Dieser Leitfaden erklärt, wie Sie die Schritte in unserem Leitfaden So installieren Sie WordPress mit LAMP unter Ubuntu 18.04​​​ automatisieren können. WordPress ist das beliebteste CMS (Content-Management-System) im Internet, das es Benutzern ermöglicht, flexible Blogs und Websites auf einem MySQL-Backend mit PHP-Verarbeitung einzurichten. Nach dem Einrichten kann fast die gesamte Verwaltung vom Web-Frontend aus erfolgen.

Voraussetzungen

Für die automatisierte Einrichtung anhand des Playbooks, das wir in diesem Leitfaden besprechen, benötigen Sie Folgendes:

Gehen Sie zunächst sicher, dass Ihr Ansible-Steuerknoten sich verbinden und Befehle auf Ihrem/Ihren Ansible-Host(s) ausführen kann. Infos zu einem Verbindungstest finden Sie in Schritt 3 unter So installieren und konfigurieren Sie Ansible unter Ubuntu 18.04.

Welchen Zweck hat dieses Playbook?

Dieses Ansible-Playbook bietet eine Alternative zur manuellen Ausführung des Verfahrens, das in unserem Leitfaden So installieren Sie WordPress mit LAMP unter Ubuntu 18.04 beschrieben ist.

Eine Ausführung dieses Playbooks führt die folgenden Aktionen auf Ihren Ansible-Hosts durch:

  1. Installieren Sie aptitude, das von Ansible als Alternative zum Paketmanager apt bevorzugt wird.
  2. Installieren Sie die erforderlichen LAMP-Pakete und PHP-Erweiterungen.
  3. Erstellen und aktivieren Sie einen neuen Apache VirtualHost für die WordPress-Website.
  4. Aktivieren Sie das Apache-Rewrite-Modul (mod_rewrite)​​.
  5. Deaktivieren Sie die Apache-Standard-Website.
  6. Legen Sie das Passwort für den MySQL-Benutzer root fest.
  7. Entfernen Sie anonyme MySQL-Konten und die Testdatenbank.
  8. Erstellen Sie eine neue MySQL-Datenbank und einen Benutzer für die WordPress-Website.
  9. Richten Sie UFW ein, um HTTP-Verkehr auf dem konfigurierten Port (standardmäßig 80) zuzulassen.
  10. Laden Sie WordPress herunter und entpacken Sie es.
  11. Richten Sie eine korrekte Verzeichniseigentümerschaft und korrekte Berechtigungen ein.
  12. Richten Sie die Datei wp-config.php mit der bereitgestellten Vorlage ein.

Wenn die Ausführung des Playbooks abgeschlossen ist, wird eine WordPress-Installation basierend auf den Optionen, die Sie in Ihren Konfigurationsvariablen definiert haben, auf einer LAMP-Umgebung ausgeführt.

So verwenden Sie dieses Playbook

Als Erstes müssen Sie das Playbook WordPress auf LAMP und seine Abhängigkeiten aus dem Repository do-community/ansible-playbooks abrufen. Klonen Sie dieses Repository in einen lokalen Ordner im Ansible-Steuerknoten.

Falls Sie dieses Repository bereits anhand eines anderen Leitfadens geklont haben, greifen Sie auf Ihre bestehende Kopie von ansible-playbooks​​​ zu und führen Sie den Befehl git pull aus, um sicherzustellen, dass Sie aktualisierten Inhalt haben:

  • cd ~/ansible-playbooks
  • git pull

Wenn Sie das Repository do-community/ansible-playbooks​​ zum ersten Mal verwenden, klonen Sie zuerst das Repository in Ihren Basisordner mit:

  • cd ~
  • git clone https://github.com/do-community/ansible-playbooks.git
  • cd ansible-playbooks

Die Dateien, die wir brauchen, befinden sich im Ordner wordpress-lamp_ubuntu1804, der die folgende Struktur hat:

wordpress-lamp_ubuntu1804
├── files
│   ├── apache.conf.j2
│   └── wp-config.php.j2
├── vars
│   └── default.yml
├── playbook.yml
└── readme.md

Hier ist eine Beschreibung jeder dieser Dateien:

  • files/apache.conf.j2: Vorlagendatei zur Einrichtung des Apache VirtualHost.
  • files/wp-config.php.j2: Vorlagendatei zum Einrichten der Konfigurationsdatei von WordPress.
  • vars/default.yml: Variablendatei zur Anpassung der Playbook-Einstellungen.
  • playbook.yml: Die Playbook-Datei mit Aufgaben zur Ausführung auf dem/den Remoteserver(n).
  • readme.md: Eine Textdatei mit Informationen über dieses Playbook.

Bearbeiten Sie die Variablendatei des Playbooks zur Anpassung der Optionen. Greifen Sie auf das Verzeichnis wordpress-lamp_ubuntu1804 zu und öffnen Sie die Datei vars/default.yml mit dem Befehlszeilen-Editor Ihrer Wahl:

  • cd wordpress-lamp_ubuntu1804
  • nano vars/default.yml

Diese Datei enthält einige Variablen, die Ihrer Aufmerksamkeit bedürfen:

vars/default.yml
---
#System Settings
php_modules: [ 'php-curl', 'php-gd', 'php-mbstring', 'php-xml', 'php-xmlrpc', 'php-soap', 'php-intl', 'php-zip' ]

#MySQL Settings
mysql_root_password: "mysql_root_password"
mysql_db: "wordpress"
mysql_user: "sammy"
mysql_password: "password"

#HTTP Settings
http_host: "your_domain"
http_conf: "your_domain.conf"
http_port: "80"

Die folgende Liste enthält eine kurze Erklärung jeder dieser Variablen und wie Sie diese ändern könnten:

  • php_modules: Ein Array mit PHP-Erweiterungen, die zur Unterstützung Ihrer Einrichtung von WordPress installiert werden sollen. Sie müssen diese Variable nicht ändern, aber Sie könnten neue Erweiterungen in die Liste aufnehmen, wenn Ihre spezifische Einrichtung es erfordert.
  • mysql_root_password: Das gewünschte Passwort für das MySQL-Konto root.
  • mysql_db: Der Name der MySQL-Datenbank, die für WordPress erstellt werden soll.
  • mysql_user​​​: Der Name des MySQL-Benutzers, der für WordPress erstellt werden soll.
  • mysql_password: Das Passwort für den neuen MySQL-Benutzer.
  • http_host: Ihr Domänenname.
  • http_conf: Der Name der Konfigurationsdatei, die in Apache erstellt wird.
  • http_port: HTTP-Port für diesen virtuellen Host, bei dem 80 die Standardeinstellung ist.

Sobald Sie mit der Aktualisierung der Variablen in vars/default.yml fertig sind, speichern und schließen Sie diese Datei. Wenn Sie nano verwendet haben, drücken Sie STRG+X, Y, dann die EINGABETASTE.

Sie können dieses Playbook jetzt auf einem oder mehreren Servern ausführen. Die meisten Playbooks werden standardmäßig auf jedem Server in Ihrem Inventar ausgeführt. Sie können das Flag -l verwenden, um sicherzustellen, dass nur eine Teilmenge von Servern oder ein einzelner Server von dem Playbook betroffen ist. Sie können auch das Flag -u verwenden, um anzugeben, welchen Benutzer Sie auf dem Remoteserver für die Verbindung und Ausführung der Playbook-Befehle auf den Remote-Hosts verwenden.

Um das Playbook nur auf server1 mit Verbindung als sammy auszuführen, können Sie folgenden Befehl verwenden:

  • ansible-playbook playbook.yml -l server1 -u sammy

Sie erhalten eine Ausgabe, die der folgenden ähnelt:

Output
PLAY [all] ***************************************************************************************************************************** TASK [Gathering Facts] ***************************************************************************************************************** ok: [server1] TASK [Install prerequisites] *********************************************************************************************************** ok: [server1] … TASK [Download and unpack latest WordPress] ******************************************************************************************** changed: [server1] TASK [Set ownership] ******************************************************************************************************************* changed: [server1] TASK [Set permissions for directories] ************************************************************************************************* changed: [server1] TASK [Set permissions for files] ******************************************************************************************************* changed: [server1] TASK [Set up wp-config] **************************************************************************************************************** changed: [server1] RUNNING HANDLER [Reload Apache] ******************************************************************************************************** changed: [server1] RUNNING HANDLER [Restart Apache] ******************************************************************************************************* changed: [server1] PLAY RECAP ***************************************************************************************************************************** server1 : ok=22 changed=18 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

Anmerkung: Weitere Informationen zur Ausführung von Ansible-Playbooks finden Sie in unserem Leitfaden Ansible-Schummelzettel.

Wenn das Playbook ausgeführt ist, können Sie zu Ihrem Webbrowser gehen, um die Installation von WordPress von dort aus zu beenden.

Navigieren Sie zu dem Domänennamen oder der öffentlichen IP-Adresse Ihres Servers:

http://server_host_or_IP

Sie sehen eine Seite wie diese:

Seite der WordPress-Sprachauswahl

Nach Auswahl der Sprache, die Sie für Ihre WordPress-Installation verwenden möchten, kommen Sie zum letzten Schritt der Einrichtung Ihres WordPress-Benutzers und -Passworts, damit Sie sich in Ihrem Kontrollfeld anmelden können:

WordPress-Einrichtung

Wenn Sie weiter klicken, kommen Sie zu einer Seite, auf der Sie sich anmelden müssen:

WP-Anmeldeaufforderung

Nach der Anmeldung gelangen Sie zum WordPress-Administrations-Dashboard:

WP-Adminbereich

Einige gängige Schritte zur Anpassung Ihrer WordPress-Installation sind u. a. die Auswahl der Permalink-Einstellung für Ihre Beiträge (in Einstellungen > Permalinks) und die Wahl eines neuen Designs (in Darstellung > Design).

Der Inhalt des Playbooks

Sie finden die Server-Einrichtung für WordPress auf LAMP in diesem Tutorial im Ordner wordpress-lamp_ubuntu1804​​​ im Repository DigitalOcean Community Playbooks. Klicken Sie zum direkten Kopieren oder Herunterladen des Skript-Inhalts auf die Schaltfläche Raw im oberen Bereich jedes Skripts.

Der vollständige Inhalt des Playbooks sowie seine zugehörigen Dateien finden Sie ebenfalls hier.

vars/default.yml

Die Variablendatei default.yml enthält Werte, die in den Playbook-Aufgaben verwendet werden, wie z. B. Datenbank-Einstellungen und den Domänennamen für die Konfiguration mit Apache.

vars/default.yml
#System Settings
php_modules: [ 'php-curl', 'php-gd', 'php-mbstring', 'php-xml', 'php-xmlrpc', 'php-soap', 'php-intl', 'php-zip' ]

#MySQL Settings
mysql_root_password: "mysql_root_password"
mysql_db: "wordpress"
mysql_user: "sammy"
mysql_password: "password"

#HTTP Settings
http_host: "your_domain"
http_conf: "your_domain.conf"
http_port: "80"

files/apache.conf.j2

Die Datei apache.conf.j2 ist eine Jinja 2-Vorlagendatei, die einen neuen Apache VirtualHost konfiguriert. Die in dieser Vorlage verwendeten Variablen sind in der Variablendatei vars/default.yml definiert.

files/apache.conf.j2
<VirtualHost *:{{ http_port }}>
   ServerAdmin webmaster@localhost
   ServerName {{ http_host }}
   ServerAlias www.{{ http_host }}
   DocumentRoot /var/www/{{ http_host }}
   ErrorLog ${APACHE_LOG_DIR}/error.log
   CustomLog ${APACHE_LOG_DIR}/access.log combined

   <Directory /var/www/{{ http_host }}>
         Options -Indexes
   </Directory>

   <IfModule mod_dir.c>
       DirectoryIndex index.php index.html index.cgi index.pl  index.xhtml index.htm
   </IfModule>

</VirtualHost>

files/wp-config.php.j2

Die Datei wp-config.php.j2 ist eine weitere Jinja-Vorlage für die Einrichtung der Hauptkonfigurationsdatei, die von WordPress verwendet wird. Die in dieser Vorlage verwendeten Variablen sind in der Variablendatei vars/default.yml definiert. Eindeutige Authentifizierungsschlüssel und Salts werden mit einer Hash-Funktion generiert.

files/info.php.j2
<?php
/**
 * The base configuration for WordPress
 *
 * The wp-config.php creation script uses this file during the
 * installation. You don't have to use the web site, you can
 * copy this file to "wp-config.php" and fill in the values.
 *
 * This file contains the following configurations:
 *
 * * MySQL settings
 * * Secret keys
 * * Database table prefix
 * * ABSPATH
 *
 * @link https://codex.wordpress.org/Editing_wp-config.php
 *
 * @package WordPress
 */

// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define( 'DB_NAME', '{{ mysql_db }}' );

/** MySQL database username */
define( 'DB_USER', '{{ mysql_user }}' );

/** MySQL database password */
define( 'DB_PASSWORD', '{{ mysql_password }}' );

/** MySQL hostname */
define( 'DB_HOST', 'localhost' );

/** Database Charset to use in creating database tables. */
define( 'DB_CHARSET', 'utf8' );

/** The Database Collate type. Don't change this if in doubt. */
define( 'DB_COLLATE', '' );

/** Filesystem access **/
define('FS_METHOD', 'direct');

/**#@+
 * Authentication Unique Keys and Salts.
 *
 * Change these to different unique phrases!
 * You can generate these using the {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org secret-key service}
 * You can change these at any point in time to invalidate all existing cookies. This will force all users to have to log in again.
 *
 * @since 2.6.0
 */
define( 'AUTH_KEY',         '{{ lookup('password', '/dev/null chars=ascii_letters length=64') }}' );
define( 'SECURE_AUTH_KEY',  '{{ lookup('password', '/dev/null chars=ascii_letters length=64') }}' );
define( 'LOGGED_IN_KEY',    '{{ lookup('password', '/dev/null chars=ascii_letters length=64') }}' );
define( 'NONCE_KEY',        '{{ lookup('password', '/dev/null chars=ascii_letters length=64') }}' );
define( 'AUTH_SALT',        '{{ lookup('password', '/dev/null chars=ascii_letters length=64') }}' );
define( 'SECURE_AUTH_SALT', '{{ lookup('password', '/dev/null chars=ascii_letters length=64') }}' );
define( 'LOGGED_IN_SALT',   '{{ lookup('password', '/dev/null chars=ascii_letters length=64') }}' );
define( 'NONCE_SALT',       '{{ lookup('password', '/dev/null chars=ascii_letters length=64') }}' );

/**#@-*/

/**
 * WordPress Database Table prefix.
 *
 * You can have multiple installations in one database if you give each
 * a unique prefix. Only numbers, letters, and underscores please!
 */
$table_prefix = 'wp_';

/**
 * For developers: WordPress debugging mode.
 *
 * Change this to true to enable the display of notices during development.
 * It is strongly recommended that plugin and theme developers use WP_DEBUG
 * in their development environments.
 *
 * For information on other constants that can be used for debugging,
 * visit the Codex.
 *
 * @link https://codex.wordpress.org/Debugging_in_WordPress
 */
define( 'WP_DEBUG', false );

/* That's all, stop editing! Happy publishing. */

/** Absolute path to the WordPress directory. */
if ( ! defined( 'ABSPATH' ) ) {
    define( 'ABSPATH', dirname( __FILE__ ) . '/' );
}

/** Sets up WordPress vars and included files. */
require_once( ABSPATH . 'wp-settings.php' );

playbook.yml

Alle Aufgaben dieser Einrichtung sind in der Datei playbook.yml definiert. Am Anfang werden die Gruppen von Servern definiert, die das Ziel dieser Einrichtung (all) sein sollen. Anschließend wird mit become: true definiert, dass Aufgaben standardmäßig mit Rechteausweitung (sudo) ausgeführt werden sollen. Dann enthält es die Variablendatei vars/default.yml, um Konfigurationsoptionen zu laden.

playbook.yml
---
- hosts: all
  become: true
  vars_files:
    - vars/default.yml

  tasks:
    - name: Install prerequisites
      apt: name=aptitude update_cache=yes state=latest force_apt_get=yes
      tags: [ system ]

    - name: Install LAMP Packages
      apt: name={{ item }} update_cache=yes state=latest
      loop: [ 'apache2', 'mysql-server', 'python3-pymysql', 'php', 'php-mysql', 'libapache2-mod-php' ]
      tags: [ system ]

    - name: Install PHP Extensions
      apt: name={{ item }} update_cache=yes state=latest
      loop: "{{ php_modules }}"
      tags: [ system ]

  # Apache Configuration
    - name: Create document root
      file:
        path: "/var/www/{{ http_host }}"
        state: directory
        owner: "www-data"
        group: "www-data"
        mode: '0755'
      tags: [ apache ]

    - name: Set up Apache VirtualHost
      template:
        src: "files/apache.conf.j2"
        dest: "/etc/apache2/sites-available/{{ http_conf }}"
      notify: Reload Apache
      tags: [ apache ]

    - name: Enable rewrite module
      shell: /usr/sbin/a2enmod rewrite
      notify: Reload Apache
      tags: [ apache ]

    - name: Enable new site
      shell: /usr/sbin/a2ensite {{ http_conf }}
      notify: Reload Apache
      tags: [ apache ]

    - name: Disable default Apache site
      shell: /usr/sbin/a2dissite 000-default.conf
      notify: Restart Apache
      tags: [ apache ]

  # MySQL Configuration
    - name: Set the root password
      mysql_user:
        name: root
        password: "{{ mysql_root_password }}"
        login_unix_socket: /var/run/mysqld/mysqld.sock
      tags: [ mysql, mysql-root ]

    - name: Remove all anonymous user accounts
      mysql_user:
        name: ''
        host_all: yes
        state: absent
        login_user: root
        login_password: "{{ mysql_root_password }}"
      tags: [ mysql ]

    - name: Remove the MySQL test database
      mysql_db:
        name: test
        state: absent
        login_user: root
        login_password: "{{ mysql_root_password }}"
      tags: [ mysql ]

    - name: Creates database for WordPress
      mysql_db:
        name: "{{ mysql_db }}"
        state: present
        login_user: root
        login_password: "{{ mysql_root_password }}"
      tags: [ mysql ]

    - name: Create MySQL user for WordPress
      mysql_user:
        name: "{{ mysql_user }}"
        password: "{{ mysql_password }}"
        priv: "{{ mysql_db }}.*:ALL"
        state: present
        login_user: root
        login_password: "{{ mysql_root_password }}"
      tags: [ mysql ]

  # UFW Configuration
    - name: "UFW - Allow HTTP on port {{ http_port }}"
      ufw:
        rule: allow
        port: "{{ http_port }}"
        proto: tcp
      tags: [ system ]

  # WordPress Configuration
    - name: Download and unpack latest WordPress
      unarchive:
        src: https://wordpress.org/latest.tar.gz
        dest: "/var/www/{{ http_host }}"
        remote_src: yes
        creates: "/var/www/{{ http_host }}/wordpress"
      tags: [ wordpress ]

    - name: Set ownership
      file:
        path: "/var/www/{{ http_host }}"
        state: directory
        recurse: yes
        owner: www-data
        group: www-data
      tags: [ wordpress ]

    - name: Set permissions for directories
      shell: "/usr/bin/find /var/www/{{ http_host }}/wordpress/ -type d -exec chmod 750 {} \\;"
      tags: [ wordpress ]

    - name: Set permissions for files
      shell: "/usr/bin/find /var/www/{{ http_host }}/wordpress/ -type f -exec chmod 640 {} \\;"
      tags: [ wordpress ]

    - name: Set up wp-config
      template:
        src: "files/wp-config.php.j2"
        dest: "/var/www/{{ http_host }}/wordpress/wp-config.php"
      tags: [ wordpress ]

  handlers:
    - name: Reload Apache
      service:
        name: apache2
        state: reloaded

    - name: Restart Apache
      service:
        name: apache2
        state: restarted

Sie können diese Dateien an Ihre individuellen Bedürfnisse in Ihrem Workflow anpassen.

Zusammenfassung

In diesem Leitfaden haben wir den Prozess der Installation und Einrichtung einer WordPress-Website mit LAMP auf einem Ubuntu-18.04-Server automatisiert.

Wenn Sie weitere Aufgaben in dieses Playbook aufnehmen möchten, um Ihre Servereinrichtung weiter anzupassen, finden Sie diesbezügliche Informationen in unserer Ansible-Einführung Grundlagen des Konfigurationsmanagements: Ansible-Playbooks schreiben.

Creative Commons License