【新・実践シェルスクリプト講座 第1回】「えっ、まだ手動でインストールしてるの?」環境構築を自動化して”神”になろう
こんにちは!「リナックス先生」です。
前回までの講座(シーズン1)で、サーバーの「監視」や「バックアップ」は完璧になりましたね。
しかし、コウ君。君はまだ、エンジニアとして一番大事な時間を無駄にしていませんか?
えっ? どういうことですか?
実は昨日、新しいVPSを契約したんですけど、Apacheを入れて、PHPを入れて、設定ファイルを書き換えて…ってやってたら、環境を作るだけで半日終わっちゃいました。
これ、もっと楽になりませんか?
それよ!
プロのエンジニアは「同じ作業を2回繰り返さない」生き物なの。
今回は、コマンド一発でWebサーバー環境(LAMP)を構築し、設定ファイルの書き換えまで完了させる「プロビジョニング(構築)スクリプト」を作るわよ!
新シリーズ「新・実践シェルスクリプト講座」の第1回は、**「環境構築の自動化」**です。dnf コマンドによるインストールはもちろん、初心者が最もつまずきやすい「設定ファイル(conf)の自動書き換え」を、sed コマンドを駆使して攻略します。
本講座のカリキュラム(全4回)
本シリーズでは、「サーバーを作って、動かし続け、使いやすくする」ための攻撃的な自動化技術を学びます。
- 【今回】黒い画面でポチポチするな!「Webサーバー構築(LAMP環境)」をボタン一発で全自動化する
- Webサイトが死んだら自動で蘇生せよ!「サービス死活監視」と「自動再起動」
- ローカル保存じゃ終わらない!「DBバックアップ」と「AWS S3/クラウドへの自動転送」
- 黒い画面をアプリ化!?「対話型メニュー」で作る自分だけの管理ツール
1. 手動構築の「何」が問題なのか?
Webサーバー(今回は AlmaLinux 9 + Apache + PHP + MariaDB のLAMP構成)を作る手順を思い出してみましょう。
dnf install httpd php mariadb-server ...を打つ。systemctl start httpdで起動する。firewall-cmdでポートを開ける。/etc/php.iniを開いて、タイムゾーンを書き換える。/etc/httpd/conf/httpd.confを開いて、ServerNameを書き換える。
これを10台のサーバーでやるとしたら?
タイポ(入力ミス)をして、1台だけ設定が違っていたら?
「Infrastructure as Code(コードによるインフラ管理)」の第一歩として、これをスクリプト化します。
2. 設定ファイル書き換えの魔術師「sed」
パッケージを入れるだけなら簡単ですが、最大の難関は「テキストファイルの編集」です。
スクリプトの中で vim を開くわけにはいきません。
そこで登場するのが、ストリームエディタ sed です。
基本形:置換して上書き保存
sed -i 's/変更前/変更後/g' ファイル名
-i: ファイルを直接上書きする (in-place)s: 置換 (substitute)g: 全て置換 (global) ※これがないと最初の1個だけ置換される
実践:php.iniのタイムゾーン変更
PHPの設定ファイルには ;date.timezone = というコメントアウトされた行があります。
これを date.timezone = Asia/Tokyo に変えたい場合、こう書きます。
sed -i 's/;date.timezone =/date.timezone = Asia\/Tokyo/g' /etc/php.ini
※スラッシュ / はエスケープ \/ する必要があります。
3. 全自動構築スクリプト「setup_lamp.sh」
それでは、実用的な構築スクリプトを作成しましょう。
このスクリプトを実行するだけで、まっさらなVPSが「Webサーバー」に早変わりします。
vim setup_lamp.sh を作成します。
#!/bin/bash
# ==========================================
# 設定エリア
# ==========================================
# ログファイル
LOG_FILE="/var/log/setup_lamp.log"
# インストールするPHPのバージョンなど(必要に応じて変更)
PHP_PACKAGES="php php-cli php-fpm php-mysqlnd php-mbstring php-json"
# --- 安全設定 ---
# エラーで停止、未定義変数で停止、パイプエラー検知
set -euo pipefail
# ==========================================
# 関数定義
# ==========================================
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}
check_root() {
if [[ $EUID -ne 0 ]]; then
echo "エラー: rootユーザーで実行してください"
exit 1
fi
}
# ==========================================
# メイン処理
# ==========================================
check_root
log "=== LAMP環境構築を開始します ==="
# 1. システムの更新
log "システムを更新しています..."
dnf -y update >> "$LOG_FILE" 2>&1
# 2. Apache (Webサーバー) のインストール
log "Apacheをインストール中..."
if ! rpm -q httpd &> /dev/null; then
dnf -y install httpd >> "$LOG_FILE" 2>&1
log "Apacheインストール完了"
else
log "Apacheは既にインストールされています (スキップ)"
fi
# 3. MariaDB (データベース) のインストール
log "MariaDBをインストール中..."
if ! rpm -q mariadb-server &> /dev/null; then
dnf -y install mariadb-server >> "$LOG_FILE" 2>&1
log "MariaDBインストール完了"
else
log "MariaDBは既にインストールされています (スキップ)"
fi
# 4. PHPのインストール
log "PHPと関連モジュールをインストール中..."
# 既存チェックは簡易的にphpコマンドで
if ! command -v php &> /dev/null; then
dnf -y install $PHP_PACKAGES >> "$LOG_FILE" 2>&1
log "PHPインストール完了"
else
log "PHPは既にインストールされています (スキップ)"
fi
# 5. 設定ファイルの自動書き換え (sedマジック!)
log "設定ファイルを調整中..."
# PHP: タイムゾーンを東京に設定
# バックアップを取ってから書き換える (php.ini.bakができる)
sed -i.bak 's/;date.timezone =/date.timezone = Asia\/Tokyo/g' /etc/php.ini
# PHP: メモリ上限を 128M -> 256M に変更
sed -i 's/memory_limit = 128M/memory_limit = 256M/g' /etc/php.ini
# Apache: ServerNameの設定 (警告消し)
# #ServerName www.example.com:80 という行を探して、その下に追記するテクニック
if ! grep -q "^ServerName localhost" /etc/httpd/conf/httpd.conf; then
sed -i '/#ServerName www.example.com:80/a ServerName localhost:80' /etc/httpd/conf/httpd.conf
fi
log "設定ファイルの変更完了"
# 6. サービスの起動と自動起動設定
log "サービスを起動中..."
systemctl enable --now httpd
systemctl enable --now mariadb
# 7. ファイアウォール設定 (http/https許可)
log "ファイアウォール設定中..."
if command -v firewall-cmd &> /dev/null; then
# 既に許可されていなければ追加
if ! firewall-cmd --list-services | grep -q http; then
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --reload
log "ポート80/443を開放しました"
fi
fi
# 8. テストページの作成
echo "<?php phpinfo(); ?>" > /var/www/html/info.php
chown apache:apache /var/www/html/info.php
log "=== 全処理完了 ==="
log "ブラウザで http://$(curl -s ifconfig.me)/info.php にアクセスして確認してください。"
💡 プロのテクニック:冪等性(べきとうせい)を意識せよ
スクリプトの中で if ! rpm -q httpd ... のように「既にインストールされているか?」をチェックしていますね。
これを入れずに dnf -y install... を毎回実行してもエラーにはなりませんが、無駄な時間がかかります。
何度実行しても結果が変わらず、エラーも出ない作りを「冪等性(Idempotency)」と呼び、インフラ自動化の最も重要な概念です。
4. 解説:ここが「自動化」のキモ!
① ログ出力のリダイレクト >> "$LOG_FILE" 2>&1
インストールコマンドは大量の文字を画面に出力します。dnf -y update などの出力を全てログファイルに捨てる(保存する)ことで、スクリプト実行時の画面をスッキリさせつつ、後でエラー解析ができるようにしています。
② sed -i.bak によるバックアップ
sed -i.bak と書くと、書き換える前のファイルを php.ini.bak として自動保存してくれます。
「スクリプトで設定を壊してしまった!」という時も、mv php.ini.bak php.ini で元に戻せる安心設計です。
③ systemctl enable --now
昔は enable (自動起動設定) と start (今すぐ起動) を2行書いていましたが、今は enable --now で1行で書けます。
モダンなLinuxコマンドを使うのも、スクリプトを短くするコツです。
5. 動作確認
実行権限を与えて実行します。
[root@localhost ~]# chmod +x setup_lamp.sh [root@localhost ~]# ./setup_lamp.sh [2026-01-07 10:00:00] === LAMP環境構築を開始します === [2026-01-07 10:00:00] システムを更新しています... [2026-01-07 10:01:20] Apacheをインストール中... ... [2026-01-07 10:03:00] === 全処理完了 === [2026-01-07 10:03:00] ブラウザで http://xxx.xxx.xxx.xxx/info.php にアクセスして確認してください。
たった数分放置するだけで、Webサーバーが完成しました。
これで、VPSを契約するたびに半日かける必要はありません。「秒」で仕事が終わります。
まとめ:構築こそ自動化すべき
今回は「新・実践シェルスクリプト講座」の第1回として、Webサーバー構築の自動化を行いました。
| 対象 | 自動化のポイント |
|---|---|
| インストール | dnf -y で確認メッセージを飛ばす |
| 設定変更 | sed コマンドでテキスト置換を行う |
| サービス起動 | systemctl enable --now で一括起動 |
| 安全性 | set -euo pipefail と事前チェック(冪等性) |
次回は、こうして構築したWebサーバーが「止まった時」にどうするか?
ただ監視するだけでなく、「自動で再起動して復旧させ、Discordに『直しておいたよ』と通知する」という、自己修復スクリプトを作成します。
深夜の障害対応コールから解放されたい人、必見です!
今回のスクリプトは、VPSを「初期化(OS再インストール)」するたびに使える一生モノの資産よ。
自分好みの設定(vimの設定やエイリアス)を追加して、最強の my_setup.sh を育てていってね!
▼何度でもOS再インストール無料!実験に最適なVPS


コメント