「3分待ってください。サーバー構築、終わらせますので」
こんにちは!「LINUX工房」管理人の「リナックス先生」です。
ついに、Ansible講座もクライマックスとなる第7回を迎えました。
これまでの講座で、あなたは「インベントリ」「Playbook」「変数」「Role」「Vault」「Handlers」という武器を手に入れました。
これらは一つ一つも便利ですが、組み合わせた時にこそ真の威力を発揮します。
先生、準備は万端です!
でも、これまでは「Apache入れるだけ」とか単発でしたよね。
本当に「Webサーバー入れて、DB作って、ユーザー権限設定して、WordPressをダウンロードして設定して…」みたいな長い工程を、一発でできるんですか?
手動でやると絶対どこかでミスるんですけど…。
もちろんよ。
今回は、インフラエンジニアの基本である「LAMP環境」の構築に加え、世界で最も使われているCMS「WordPress」のデプロイまでを完全自動化するわ。
コマンドを叩いてコーヒーを飲んでいる間に、サイトが完成する感動を味わってちょうだい!
本記事では、AlmaLinux 9 をターゲットに、実務に即した「Role構成」でPlaybookを作成します。
パスワード管理には前回学んだ Ansible Vault を使用し、セキュリティも考慮した本格的な構成です。
🚀 Ansible完全攻略講座(バックナンバー)
現在地:【第7回】実践演習。LAMP環境(Apache+MySQL+PHP)をボタン一つで構築する
- 【第1回】構成管理の革命児!エージェントレスで始める自動化入門&環境構築
- 【第2回】ターゲットを支配せよ。インベントリの書き方とansible.cfgの最適解
- 【第3回】Playbookの基礎。YAMLの作法と「モジュール」によるタスク定義
- 【第4回】変数を使いこなせ。Jinja2テンプレートによる設定ファイルの動的生成
- 【第5回】コードを整理整頓。Rolesディレクトリ構成と再利用性の最大化
- 【第6回】秘密情報の管理と通知。Ansible Vaultの暗号化とHandlers
- 【第7回】実践演習。LAMP環境(Apache+MySQL+PHP)をボタン一つで構築する
- 【第8回】GUIで管理。Ansible AWX(Tower)入門とCI/CDパイプラインへの統合
第1章:プロジェクトの全体設計
まずは設計図を描きます。
今回は1台のサーバーに全ての機能(Web + DB)を入れる構成にしますが、Roleを使って機能ごとにディレクトリを分けます。
作成するRole(役割)
- common: 全サーバー共通設定(SELinux, Firewalld, 便利ツールなど)。
- web: Apache (httpd) と PHP のインストール・設定。
- db: MariaDB のインストール、DB作成、ユーザー作成。
- 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.cfg に vault_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_db や mysql_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」で自分専用環境
自動化の実績をポートフォリオに
「ITエンジニア転職」

コメント