最終試験:ボタン一つで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の真価を体験します。
🚀 【続・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をダウンロードして展開 |
自動化のポイント
- DBパスワードの保護: Ansible Vaultを使って暗号化する。
- 設定ファイルの動的生成:
wp-config.phpやhttpd.confをテンプレートから生成する。 - 冪等性の担保: 「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_db や mysql_user モジュールを使うには、ターゲットサーバー側にPythonライブラリ python3-PyMySQL が必要です。
これを入れ忘れると「module community.mysql.mysql_db not found」のようなエラーで止まります。
依存関係もPlaybook内で解決するのがIaCの鉄則です。
プロのためのLinuxシステム構築・運用技術改訂新版 システム構築運用/ネットワーク・ストレージ管理の秘 (Software Design plusシリーズ) [ 中井悦司 ] 価格:3278円 |
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」
IaCスキルを年収に変える
「ITエンジニア転職」

コメント