【無料ツール】画像をPDFに変換するPhotoPDF Appを公開しました!

【Ansible講座 第7回】実践演習。LAMP環境(Apache+MySQL+PHP)とWordPressをボタン一つで完全自動構築する

「3分待ってください。サーバー構築、終わらせますので」

こんにちは!「LINUX工房」管理人の「リナックス先生」です。
ついに、Ansible講座もクライマックスとなる第7回を迎えました。

これまでの講座で、あなたは「インベントリ」「Playbook」「変数」「Role」「Vault」「Handlers」という武器を手に入れました。
これらは一つ一つも便利ですが、組み合わせた時にこそ真の威力を発揮します。

コウ君

先生、準備は万端です!
でも、これまでは「Apache入れるだけ」とか単発でしたよね。
本当に「Webサーバー入れて、DB作って、ユーザー権限設定して、WordPressをダウンロードして設定して…」みたいな長い工程を、一発でできるんですか?
手動でやると絶対どこかでミスるんですけど…。

リナックス先生

もちろんよ。
今回は、インフラエンジニアの基本である「LAMP環境」の構築に加え、世界で最も使われているCMS「WordPress」のデプロイまでを完全自動化するわ。
コマンドを叩いてコーヒーを飲んでいる間に、サイトが完成する感動を味わってちょうだい!

本記事では、AlmaLinux 9 をターゲットに、実務に即した「Role構成」でPlaybookを作成します。
パスワード管理には前回学んだ Ansible Vault を使用し、セキュリティも考慮した本格的な構成です。


第1章:プロジェクトの全体設計

まずは設計図を描きます。
今回は1台のサーバーに全ての機能(Web + DB)を入れる構成にしますが、Roleを使って機能ごとにディレクトリを分けます。

作成するRole(役割)

  1. common: 全サーバー共通設定(SELinux, Firewalld, 便利ツールなど)。
  2. web: Apache (httpd) と PHP のインストール・設定。
  3. db: MariaDB のインストール、DB作成、ユーザー作成。
  4. wordpress: WordPress本体のダウンロード、展開、設定ファイル配置。

ディレクトリ構成

lamp_project/
├── ansible.cfg
├── inventory.yml
├── group_vars/
│   └── all/
│       ├── vars.yml       # 共通変数(ポート番号など)
│       └── vault.yml      # 秘密変数(DBパスワードなど)
├── roles/
│   ├── common/
│   ├── web/
│   ├── db/
│   └── wordpress/
└── site.yml               # メインPlaybook

第2章:変数の準備とVault暗号化

最初に、全体で使用する変数を定義します。
特にデータベースのパスワードは Ansible Vault で暗号化します。

1. 共通変数 (group_vars/all/vars.yml)

http_port: 80
wp_db_name: "wordpress"
wp_db_user: "wp_user"
wp_install_dir: "/var/www/html"

2. 秘密変数 (group_vars/all/vault.yml)

パスワードは暗号化します。

ansible-vault create group_vars/all/vault.yml

入力内容:

wp_db_password: "SuperSecretPass123!"
mysql_root_password: "RootSecretPass123!"

※実行時にパスワード入力を省略するため、.vault_pass ファイルを作成し、ansible.cfgvault_password_file = ./.vault_pass を設定しておくと便利です(第6回参照)。


第3章:Role 1「common」基礎を固める

まずは、どのサーバーでも必要となる基本的な設定を行います。
特に Firewalld の設定と、AnsibleでMySQLを操作するために必要なPythonライブラリの導入が重要です。

roles/common/tasks/main.yml

---
- name: Install basic tools
  ansible.builtin.dnf:
    name:
      - vim
      - curl
      - unzip
      - tar
      - python3-PyMySQL  # Ansibleのmysqlモジュールに必須!
    state: present

- name: Start Firewalld
  ansible.builtin.systemd:
    name: firewalld
    state: started
    enabled: true

- name: Open HTTP/HTTPS ports
  ansible.posix.firewalld:
    service: "{{ item }}"
    permanent: true
    state: enabled
    immediate: true
  loop:
    - http
    - https

⚠️ 重要ポイント:python3-PyMySQL
Ansibleの community.mysql モジュールを使ってDB操作をするには、ターゲットサーバー側にPythonのMySQLドライバが必要です。
AlmaLinux 9では python3-PyMySQL パッケージを必ずインストールしてください。


第4章:Role 2「db」データベースの構築

MariaDBをインストールし、データベースとユーザーを作成します。
ここでは community.mysql コレクションを使用します(標準で入っていない場合は ansible-galaxy collection install community.mysql が必要ですが、今回は簡易的にdnfとshell、あるいは標準モジュールで実装します)。

roles/db/tasks/main.yml

---
- name: Install MariaDB
  ansible.builtin.dnf:
    name: mariadb-server
    state: present

- name: Start MariaDB
  ansible.builtin.systemd:
    name: mariadb
    state: started
    enabled: true

- name: Create WordPress Database
  community.mysql.mysql_db:
    name: "{{ wp_db_name }}"
    state: present
    login_unix_socket: /var/lib/mysql/mysql.sock

- name: Create WordPress User
  community.mysql.mysql_user:
    name: "{{ wp_db_user }}"
    password: "{{ wp_db_password }}"  # Vault変数を参照
    priv: "{{ wp_db_name }}.*:ALL"
    host: localhost
    state: present
    login_unix_socket: /var/lib/mysql/mysql.sock

mysql_dbmysql_user は冪等性(何度実行しても大丈夫)を持っています。


第5章:Role 3「web」ApacheとPHPの導入

WebサーバーとPHPをインストールします。
WordPressはPHPで動くため、必要なPHP拡張モジュールも忘れずに入れます。

roles/web/tasks/main.yml

---
- name: Install Apache and PHP
  ansible.builtin.dnf:
    name:
      - httpd
      - php
      - php-mysqlnd  # MySQL接続用
      - php-gd
      - php-xml
      - php-mbstring
      - php-json
    state: present

- name: Start Apache
  ansible.builtin.systemd:
    name: httpd
    state: started
    enabled: true

※必要に応じて php.ini をテンプレートで配布するタスクを追加しても良いでしょう。


第6章:Role 4「wordpress」アプリのデプロイ

ここが今回のハイライトです。
公式サイトから最新のWordPressをダウンロードし、展開し、設定ファイル(wp-config.php)を生成します。

1. テンプレートの作成 (roles/wordpress/templates/wp-config.php.j2)

WordPressの設定ファイルはサンプル(wp-config-sample.php)をコピーしても良いですが、ここではJinja2テンプレートとして作成し、変数を埋め込みます。

<?php
define( 'DB_NAME',     '{{ wp_db_name }}' );
define( 'DB_USER',     '{{ wp_db_user }}' );
define( 'DB_PASSWORD', '{{ wp_db_password }}' );
define( 'DB_HOST',     'localhost' );
define( 'DB_CHARSET',  'utf8' );
define( 'DB_COLLATE',  '' );

$table_prefix = 'wp_';
define( 'WP_DEBUG', false );

if ( ! defined( 'ABSPATH' ) ) {
	define( 'ABSPATH', __DIR__ . '/' );
}
require_once ABSPATH . 'wp-settings.php';

2. タスクの定義 (roles/wordpress/tasks/main.yml)

---
- name: Download and Unarchive WordPress
  ansible.builtin.unarchive:
    src: https://wordpress.org/latest.tar.gz
    dest: "/var/www/html/"
    remote_src: yes
    creates: "/var/www/html/wordpress/index.php" # 既にあったら実行しない
    owner: apache
    group: apache

# 展開されると /var/www/html/wordpress になるため、中身をドキュメントルート直下に移動する処理が必要
# 簡易化のため、ここでは /wordpress ディレクトリのまま進めるか、同期する
# 今回はApacheのドキュメントルートをいじるのは手間なので、
# /var/www/html/wordpress にアクセスしてもらう前提とする

- name: Deploy wp-config.php
  ansible.builtin.template:
    src: wp-config.php.j2
    dest: "/var/www/html/wordpress/wp-config.php"
    owner: apache
    group: apache
    mode: '0640'

- name: Change ownership of wordpress directory
  ansible.builtin.file:
    path: "/var/www/html/wordpress"
    owner: apache
    group: apache
    recurse: yes
    state: directory

第7章:実行と動作確認

全てのRoleが完成しました。
これらをまとめる site.yml を作成し、実行します。

site.yml

---
- name: Build LAMP Server and WordPress
  hosts: all
  become: true
  
  roles:
    - common
    - db
    - web
    - wordpress

いざ、実行!

ansible-playbook site.yml

ずらりと流れるログを眺めながらコーヒーを一口。
全てが緑色(ok)または黄色(changed)になり、赤色(failed)が出なければ成功です。

ブラウザで確認

http://[サーバーのIPアドレス]/wordpress/ にアクセスしてください。

WordPressの「ようこそ」画面(言語選択やサイト名入力画面)が表示されましたか?
DB接続エラーにならずにこの画面が出たということは、Apacheが動き、PHPが動き、MariaDBが動き、そしてAnsibleが設定したDBパスワードが正しく機能しているということです。


まとめ:手動構築にはもう戻れない

お疲れ様でした!
これまで手作業で1時間かけていたLAMP環境構築が、Playbookを実行するだけの数分で完了しました。

今回の成果:

  • 完全自動化: OS設定からアプリ配置まで、人間がキーボードに触れることなく完了。
  • 再現性: サーバーを壊しても、もう一度実行すれば全く同じ環境が復活する。
  • セキュリティ: DBパスワードはVaultで暗号化され、安全に管理されている。

これが Infrastructure as Code (IaC) の威力です。
しかし、まだ課題はあります。
「Playbookを実行する」という作業自体は、エンジニアが手動でコマンドを叩いています。
もし、Gitにコードをプッシュした瞬間に、自動でAnsibleが走り、テスト環境が構築されたらどうでしょうか?

次回、最終回となる第8回は「GUIで管理。Ansible AWX(Tower)入門とCI/CDパイプラインへの統合」です。
Ansibleをブラウザから操作できるGUIツール「AWX」の紹介と、JenkinsやGitLab CIなどと連携して「真の全自動化」を実現する未来地図を描きます。
Ansibleマスターへの最終ステップです。お楽しみに!

▼ フルスタック構築に挑戦する ▼

WordPressを構築してみる
「VPS」で自分専用環境

おすすめVPSを見る

自動化の実績をポートフォリオに
「ITエンジニア転職」

転職エージェントを見る

コメント