序章

最新のアプリケーション環境は使い捨てであるため、サーバーの自動化はシステム管理において重要な役割を果たしています。 構成管理ツール( Ansible など)は通常、新しいサーバーの標準手順を確立することでサーバーセットアップを自動化するプロセスを合理化すると同時に、手動セットアップに関連する人的エラーを減らします。

Ansibleは、ノードに特別なソフトウェアをインストールする必要のないシンプルなアーキテクチャを提供します。 また、自動化スクリプトの作成を容易にする堅牢な機能セットと組み込みモジュールも提供します。

このガイドでは、Ansibleを使用して、 Ubuntu18.04にLAMPを使用してWordPressをインストールする方法に関するガイドに含まれる手順を自動化する方法について説明します。 WordPressはインターネット上で最も人気のあるCMS(コンテンツ管理システム)であり、ユーザーはPHP処理を使用してMySQLバックエンド上に柔軟なブログやWebサイトをセットアップできます。 セットアップ後、ほとんどすべての管理はWebフロントエンドを介して実行できます。

前提条件

このガイドで説明しているプレイブックが提供する自動セットアップを実行するには、次のものが必要です。

  • 1つのAnsibleコントロールノード:SSHキーを使用してAnsibleホストに接続するようにAnsibleがインストールおよび構成されたUbuntu18.04マシン。 サーバーの初期設定ガイドで説明されているように、コントロールノードにsudo権限とファイアウォールが有効になっている通常のユーザーがいることを確認してください。 Ansibleをセットアップするには、 Ubuntu18.04にAnsibleをインストールして構成する方法に関するガイドに従ってください。
  • 1つ以上のAnsibleホストUbuntu18.04でAnsibleを使用して初期サーバーセットアップを自動化する方法のガイドに従って以前にセットアップされた1つ以上のリモートUbuntu18.04サーバー。

先に進む前に、まず、AnsibleコントロールノードがAnsibleホストに接続してコマンドを実行できることを確認する必要があります。 接続テストについては、 Ubuntu18.04にAnsibleをインストールして構成する方法のステップ3を確認してください。

このハンドブックは何をしますか?

このAnsibleプレイブックは、 Ubuntu18.04にLAMPを使用してWordPressをインストールする方法に関するガイドで概説されている手順を手動で実行する代わりの方法を提供します。

このプレイブックを実行すると、Ansibleホストで次のアクションが実行されます。

  1. aptitudeをインストールします。これは、aptパッケージマネージャーの代わりにAnsibleで推奨されています。
  2. 必要なLAMPパッケージとPHP拡張機能をインストールします。
  3. WordPressWebサイト用に新しいApacheVirtualHostを作成して有効にします。
  4. Apacheリライト(mod_rewrite)モジュールを有効にします。
  5. デフォルトのApacheWebサイトを無効にします。
  6. MySQL rootユーザーのパスワードを設定します。
  7. 匿名のMySQLアカウントとテストデータベースを削除します。
  8. WordPressWebサイト用の新しいMySQLデータベースとユーザーを作成します。
  9. 構成されたポートでHTTPトラフィックを許可するようにUFWを設定します(デフォルトでは80)。
  10. WordPressをダウンロードして解凍します。
  11. 正しいディレクトリの所有権と権限を設定します。
  12. 付属のテンプレートを使用してwp-config.phpファイルを設定します。

プレイブックの実行が完了すると、構成変数内で定義したオプションに基づいて、LAMP環境上でWordPressのインストールが実行されます。

このハンドブックの使い方

最初に行う必要があるのは、WordPressonLAMPプレイブックとその依存関係をdo-community/ansible-playbooksリポジトリから取得することです。 このリポジトリをAnsibleコントロールノード内のローカルフォルダーに複製する必要があります。

別のガイドに従って以前にこのリポジトリのクローンを作成したことがある場合は、既存のansible-playbooksコピーにアクセスし、git pullコマンドを実行して、内容が更新されていることを確認してください。

  1. cd ~/ansible-playbooks
  2. git pull

do-community/ansible-playbooksリポジトリを初めて使用する場合は、次のコマンドを使用してリポジトリをホームフォルダに複製することから始める必要があります。

  1. cd ~
  2. git clone https://github.com/do-community/ansible-playbooks.git
  3. cd ansible-playbooks

関心のあるファイルは、wordpress-lamp_ubuntu1804フォルダー内にあります。このフォルダーの構造は次のとおりです。

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

これらの各ファイルは次のとおりです。

  • files/apache.conf.j2:ApacheVirtualHostをセットアップするためのテンプレートファイル。
  • files/wp-config.php.j2:WordPressの設定ファイルを設定するためのテンプレートファイル。
  • vars/default.yml:プレイブックの設定をカスタマイズするための可変ファイル。
  • playbook.yml:リモートサーバーで実行されるタスクを含むプレイブックファイル。
  • readme.md:このハンドブックに関する情報を含むテキストファイル。

プレイブックの可変ファイルを編集して、オプションをカスタマイズします。 wordpress-lamp_ubuntu1804ディレクトリにアクセスし、選択したコマンドラインエディタを使用してvars/default.ymlファイルを開きます。

  1. cd wordpress-lamp_ubuntu1804
  2. nano vars/default.yml

このファイルには、注意が必要ないくつかの変数が含まれています。

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"

次のリストには、これらの各変数の簡単な説明と、それらを変更する方法が含まれています。

  • php_modules:WordPressセットアップをサポートするためにインストールする必要があるPHP拡張機能を含む配列。 この変数を変更する必要はありませんが、特定のセットアップで必要な場合は、リストに新しい拡張機能を含めることをお勧めします。
  • mysql_root_password rootMySQLアカウントに必要なパスワード。
  • mysql_db:WordPress用に作成する必要があるMySQLデータベースの名前。
  • mysql_user:WordPress用に作成する必要があるMySQLユーザーの名前。
  • mysql_password:新しいMySQLユーザーのパスワード。
  • http_host:ドメイン名。
  • http_conf:Apache内で作成される構成ファイルの名前。
  • http_port:この仮想ホストのHTTPポート。80がデフォルトです。

vars/default.yml内の変数の更新が完了したら、このファイルを保存して閉じます。 nanoを使用した場合は、CTRL + XYENTERの順に押してください。

これで、このプレイブックを1つ以上のサーバーで実行する準備が整いました。 ほとんどのプレイブックは、デフォルトでインベントリ内のすべてのサーバーで実行されるように構成されています。 -lフラグを使用して、サーバーのサブセットまたは単一のサーバーのみがプレイブックの影響を受けるようにすることができます。 -uフラグを使用して、リモートホストでPlaybookコマンドに接続して実行するために使用しているリモートサーバー上のユーザーを指定することもできます。

server1でのみプレイブックを実行し、sammyとして接続するには、次のコマンドを使用できます。

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

次のような出力が得られます。

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

:Ansibleプレイブックの実行方法の詳細については、Ansibleチートシートガイドを確認してください。

プレイブックの実行が終了したら、Webブラウザーに移動して、そこからWordPressのインストールを完了することができます。

サーバーのドメイン名またはパブリックIPアドレスに移動します。

http://server_host_or_IP

次のようなページが表示されます。

WordPress language selection page

WordPressのインストールに使用する言語を選択すると、コントロールパネルにログインできるようにWordPressのユーザーとパスワードを設定するための最後の手順が表示されます。

WordPress Setup

先にクリックすると、ログインを求めるページが表示されます。

WP login prompt

ログインすると、WordPress管理ダッシュボードが表示されます。

WP Admin Panel

WordPressのインストールをカスタマイズするための一般的な次の手順には、投稿のパーマリンク設定の選択(Settings > Permalinksにあります)と新しいテーマの選択(Appearance > Themesにあります)が含まれます。

プレイブックの内容

このチュートリアルで紹介されているWordPressonLAMPサーバーのセットアップは、 DigitalOcean CommunityPlaybooksリポジトリ内のwordpress-lamp_ubuntu1804フォルダーにあります。 スクリプトの内容を直接コピーまたはダウンロードするには、各スクリプトの上部にあるRawボタンをクリックします。

プレイブックの全内容とそれに関連するファイルも、便宜上ここに含まれています。

vars / default.yml

default.yml変数ファイルには、データベース設定や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

apache.conf.j2ファイルは、新しいApacheVirtualHostを構成するJinja2テンプレートファイルです。 このテンプレート内で使用される変数は、vars/default.yml変数ファイルで定義されています。

files / apache.conf.j2
<VirtualHost *:{{ http_port }}>
   ServerAdmin [email protected]
   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

wp-config.php.j2ファイルは別のJinjaテンプレートであり、WordPressで使用されるメインの構成ファイルをセットアップするために使用されます。 このテンプレート内で使用される変数は、vars/default.yml変数ファイルで定義されています。 一意の認証キーとソルトは、ハッシュ関数を使用して生成されます。

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

playbook.ymlファイルは、このセットアップのすべてのタスクが定義されている場所です。 まず、このセットアップのターゲットとなるサーバーのグループ(all)を定義し、その後、become: trueを使用して、特権昇格( [ X197X])デフォルトで。 次に、構成オプションをロードするためのvars/default.yml変数ファイルが含まれています。

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

独自のワークフロー内の個々のニーズに最も合うように、これらのファイルを自由に変更してください。

結論

このガイドでは、Ansibleを使用して、Ubuntu18.04サーバーにLAMPを使用してWordPressWebサイトをインストールおよびセットアップするプロセスを自動化しました。

サーバー設定をさらにカスタマイズするためにこのプレイブックに他のタスクを含めたい場合は、Ansibleの紹介ガイド構成管理101:Ansibleプレイブックの作成を参照してください。