【連載 第8回】実践プロジェクト:LAMP環境の完全自動構築と総まとめ〜IaCの旅路の果てに〜

最終試験:ボタン一つでWordPressが立ち上がる魔法をかけよう。

こんにちは!「LINUX工房」管理人の「リナックス先生」です。
全8回にわたる「Ansible中級者講座」、ついに最終回を迎えました。
ここまでついてきてくれた皆さん、本当にありがとうございます。

第1回から前回まで、私たちは多くの武器を手に入れました。

  • 変数とFacts:環境の差異を吸収する力 (第1回)
  • LoopとWhen:複雑な処理を効率化する力 (第2回)
  • Handlers:無駄な再起動を防ぐスマートさ (第3回)
  • Template:設定ファイルを自在に操る力 (第4回)
  • Roles:コードを部品化して整理する力 (第5回)
  • Vault:機密情報を守る堅牢さ (第6回)
  • Debug:失敗を恐れず解決する力 (第7回)

今日はこれらを総動員して、一つの集大成を作り上げます。
課題は「まっさらなサーバーに、WordPressが動くLAMP環境を全自動で構築すること」です。

コウ君

先生、ついにラストですね!
最初は「コマンド打ったほうが早くない?」って思ってましたが、今はもう手作業には戻れません。
でも、WordPress構築って結構手順多いですよね? DB作ったり、権限変えたり…。
本当に全部自動化できるんですか?

リナックス先生

もちろんよ、コウ君。
プロの現場では「手順書を見ながら作業」なんて時代遅れ。
「コードを実行してコーヒーを飲んで待つ」のが当たり前なの。
今回は、実務でそのまま使えるレベルの「美しいディレクトリ構成」と「再利用可能なロール設計」で構築するわよ。
これが書ければ、あなたはもう立派な自動化エンジニアよ!

本記事では、これまでの連載の総決算として、LAMP環境構築の実践プロジェクトを通して、Ansibleの真価を体験します。


1. プロジェクトの要件定義と設計

コードを書き始める前に、「何を作るのか」を明確にします。
今回は、1台のサーバー上にLAMP環境を構築します。

構築環境とミドルウェア

要素 採用技術 備考
OS AlmaLinux 9 (またはRHEL9系) SELinuxはEnforcing(有効)のまま構築する
Webサーバー Apache (httpd) バーチャルホスト設定を行う
DBサーバー MariaDB 10.5 rootパスワードを設定し、WP用DBを作成する
言語ランタイム PHP 8.x WordPressに必要な拡張モジュールを含む
アプリ WordPress (最新版) 公式サイトからtar.gzをダウンロードして展開

自動化のポイント

  1. DBパスワードの保護: Ansible Vaultを使って暗号化する。
  2. 設定ファイルの動的生成: wp-config.phphttpd.conf をテンプレートから生成する。
  3. 冪等性の担保: 「2回実行しても壊れない(データの初期化などを繰り返さない)」ように作る。

2. ディレクトリ構成の設計(ベストプラクティス)

第5回で学んだ「Roles」を活用し、実務的なディレクトリ構成を作成します。

lamp_project/
├── inventory.ini          # インベントリファイル
├── site.yml               # メインPlaybook
├── group_vars/
│   └── all.yml            # 全体共通変数(暗号化パスワード含む)
└── roles/
    ├── common/            # 共通設定 (EPEL, 基本ツール)
    ├── db/                # DB設定 (MariaDB)
    └── web/               # Web設定 (Apache, PHP, WordPress)

まずはプロジェクトディレクトリを作成し、ロールの雛形を作ります。

mkdir -p lamp_project/roles
cd lamp_project/roles
ansible-galaxy init common
ansible-galaxy init db
ansible-galaxy init web

3. 【Role作成 1】common:全サーバー共通の土台作り

まずは、どのサーバーにも必ず適用する共通設定を作ります。
ここでは「EPELリポジトリの導入」と「SELinux管理ツールのインストール」を行います。

roles/common/tasks/main.yml

---
- name: EPELリポジトリのインストール
  ansible.builtin.dnf:
    name: epel-release
    state: present

- name: 基本ツールのインストール (Loop使用)
  ansible.builtin.dnf:
    name: "{{ item }}"
    state: present
  loop:
    - vim
    - curl
    - wget
    - policycoreutils-python-utils  # SELinux管理用

ポイント:
第2回で学んだ loop を使って、パッケージリストをスッキリ記述しています。


4. 【Role作成 2】db:セキュアなデータベース構築

次にデータベース周りです。ここでの肝は、Ansible Vaultで暗号化したパスワードを使う点です。

4-1. 変数の定義 (group_vars/all.yml)

まず、パスワードを定義します。第6回で学んだ encrypt_string を使う想定です。
(ここでは便宜上平文で書きますが、本番では必ず暗号化してください)

# group_vars/all.yml
db_root_password: "MySuperSecretRootPassword"
wp_db_name: "wordpress"
wp_db_user: "wp_user"
wp_db_password: "WpUserPassword123"

4-2. タスクの定義 (roles/db/tasks/main.yml)

MariaDBのインストール、起動、そしてDBとユーザーの作成を行います。

---
- name: MariaDBのインストール
  ansible.builtin.dnf:
    name:
      - mariadb-server
      - python3-PyMySQL  # AnsibleでMySQLを操作するために必須
    state: present

- name: MariaDBの起動と自動起動設定
  ansible.builtin.service:
    name: mariadb
    state: started
    enabled: true

- name: WordPress用データベースの作成
  community.mysql.mysql_db:
    name: "{{ wp_db_name }}"
    state: present
    login_unix_socket: /var/lib/mysql/mysql.sock

- name: WordPress用DBユーザーの作成
  community.mysql.mysql_user:
    name: "{{ wp_db_user }}"
    password: "{{ wp_db_password }}"
    priv: "{{ wp_db_name }}.*:ALL"
    host: localhost
    state: present
    login_unix_socket: /var/lib/mysql/mysql.sock

💡 プロのノウハウ:PyMySQLの罠
Ansibleの mysql_dbmysql_user モジュールを使うには、ターゲットサーバー側にPythonライブラリ python3-PyMySQL が必要です。
これを入れ忘れると「module community.mysql.mysql_db not found」のようなエラーで止まります。
依存関係もPlaybook内で解決するのがIaCの鉄則です。


5. 【Role作成 3】web:Webサーバーとアプリケーション配置

最難関のWebサーバー周りです。Apacheの設定、PHPの導入、WordPressの展開を一気に行います。

5-1. タスクの定義 (roles/web/tasks/main.yml)

---
- name: ApacheとPHPのインストール
  ansible.builtin.dnf:
    name:
      - httpd
      - php
      - php-mysqlnd
      - php-gd
      - php-json
    state: present

- name: Apacheの起動
  ansible.builtin.service:
    name: httpd
    state: started
    enabled: true

- name: 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

- name: wp-config.php の配置 (Template使用)
  ansible.builtin.template:
    src: wp-config.php.j2
    dest: /var/www/html/wordpress/wp-config.php
    owner: apache
    group: apache
    mode: '0640'
  notify: Restart Apache

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

WordPressの設定ファイル雛形を用意します。
{{ }} で変数を埋め込むのがポイントです。

<?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' );

$table_prefix = 'wp_';

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

5-3. ハンドラーの定義 (roles/web/handlers/main.yml)

設定ファイルが変わった時だけ再起動するようにします。

---
- name: Restart Apache
  ansible.builtin.service:
    name: httpd
    state: restarted

6. Playbookの結合と実行

役者は揃いました。最後にこれらを統括する site.yml を書きます。

6-1. メインPlaybook (site.yml)

---
- name: LAMP環境構築プロジェクト
  hosts: all
  become: true

  # ロールの適用順序
  roles:
    - common
    - db
    - web

6-2. 実行コマンド

さあ、運命の実行です。
Vaultパスワードファイルがある場合は、以下のコマンドを打ち込みます。

ansible-playbook -i inventory.ini site.yml --vault-password-file .vault_pass

緑色(ok)と黄色(changed)の文字が流れ、最後に赤色(failed)が出なければ大成功です。
ブラウザで http://サーバーIP/wordpress/ にアクセスしてみてください。
WordPressのインストール画面が表示されれば、あなたのAnsibleスキルは本物です!

⚠️ トラブルシューティング
もし「データベース接続確立エラー」が出た場合は、SELinuxがDB接続をブロックしている可能性があります。
その場合は以下のタスクを common ロールなどに追加してください。
seboolean: name=httpd_can_network_connect_db state=yes persistent=yes


7. 連載の総まとめ:IaCエンジニアとしての未来

全8回、本当にお疲れ様でした!
この連載を通じて、皆さんはAnsibleの基礎から、実務で戦えるレベルの応用技術までを習得しました。

習得したスキルセット:

  • Playbookの基礎記述力(YAML構文、モジュール利用)
  • コードの再利用設計(変数、ループ、ロール化)
  • 環境の動的制御(Facts、Jinja2テンプレート)
  • セキュリティ意識(Vaultによる暗号化)
  • トラブル対応力(デバッグ、エラーハンドリング)
コウ君

先生、本当にありがとうございました!
最初は「自動化なんて難しそう」って思ってましたが、自分で書いたコードでサーバーが組み上がっていくのが楽しくて仕方ありません。
もっと色々なものを自動化したくなりました! 次は何を勉強すればいいですか?

リナックス先生

素晴らしい成長ね、コウ君。
Ansibleの世界はまだまだ奥が深いの。
次はGUIでジョブ管理ができる「AWX (Ansible Tower)」や、クラウド環境(AWS/Azure)の構築、そして「CI/CDパイプラインへの組み込み」に挑戦してみるといいわ。
自動化の旅に終わりはないの。楽しんで続けてね!

エンジニアにとって、時間は最も貴重なリソースです。
Ansibleを使って「退屈な作業」を自動化し、空いた時間で「新しい価値」を創造する。
それこそが、Infrastructure as Codeの真の目的です。

あなたのエンジニアライフが、Ansibleによってより豊かで楽しいものになることを願っています。
それでは、また別の連載でお会いしましょう!

▼ 学びを止めないために ▼

自分だけの検証環境を持つ
「おすすめVPS」

VPSランキングを見る

IaCスキルを年収に変える
「ITエンジニア転職」

転職エージェントを見る

コメント