運用自動化ツール

【RHEL系Linux】開発サーバー初期設定スクリプトの完全自動化

開発サーバーを毎回手作業で構築していませんか?

SELinuxの無効化やタイムゾーンの設定、パッケージの導入など、初期構築には意外と多くの工程があります。そしてそのすべてが、設定ミスや手順漏れによって後々のトラブルにつながるリスクを抱えています。

本記事では、RHEL系Linuxを対象とした開発サーバー初期設定スクリプト init_rhel_devhost.sh の構成と設計意図を解説します。root権限で一括実行するだけで、すべての初期設定が自動で反映されるよう設計されており、再実行時にも常に同じ状態が保たれる冪等な構造が特徴です。

安全かつ高速にサーバーを立ち上げたいなら、初期構築の自動化は避けて通れません。このスクリプトがなぜ必要で、どのような仕組みで構成されているのかを整理していきます。

初期設定スクリプトの概要と目的

RHEL系Linuxで開発サーバーを立ち上げる際には、セキュリティポリシーの調整、ネットワークや言語環境の整備、各種ユーティリティの導入といった初期設定が必要になります。

これらの設定はどれも漏れが許されず、サーバーの安定稼働に直結する重要な工程です。 初期構築を人手で行う場合、手順の属人化や設定のバラつき、入力ミスといった運用上のリスクが伴います。

本スクリプトは、それらの問題を解消するために設計された完全自動化型の初期設定スクリプトです。処理の流れ、エラーハンドリング、ログ出力、そして再実行時の冪等性までを考慮しており、構築作業の再現性と安全性を両立します。

初期設定スクリプトの導入背景

このスクリプトは、私たちが構築・運用しているプロダクトを安定的に展開するために必要不可欠な要素として作成しました。

プロダクトを実行する開発用サーバーを複数用意する中で、すべてのマシンに対して同じ初期設定を迅速かつ確実に適用する必要がありました。ただし、サーバーの台数は限られており、Ansibleのような構成管理ツールを導入するにはやや規模が小さく、オーバースペックとなる状況でした。

そのため、rootで一発実行できる初期設定スクリプトという形で、必要最小限かつ高信頼の自動化を実現する方針を選びました。構築ミスの排除と環境統一のために、このスクリプトはプロダクト運用を支える基盤ツールとして位置づけられています。

構築ミスを減らす自動化の意義

本スクリプトは、以下の自動化処理を網羅しています。

カテゴリ自動化される内容
セキュリティSELinux、SSHログイン制限、firewalld設定、IPv6無効化
環境設定ロケール、タイムゾーン、ホスト名
パッケージdnfによる更新・キャッシュ・必要ツール導入
カーネルlimits.conf、ulimit、sysctlによるパラメータ最適化

これらを1つのスクリプトに統合することで、作業者は迷うことなく正しい初期状態を即座に構築できます。実行ログが標準出力とファイルの両方に出力されるため、構築後の確認やトラブル対応にも有効です。

実行対象や権限の前提条件

このスクリプトはroot権限での実行を前提としています。設定対象には `/etc` 配下のシステムファイルが含まれるため、一般ユーザーでは操作できません。 また、スクリプトは以下のようなパス構成を前提としています。

/root/projects/scripts/bin/init_rhel_devhost.sh
/root/projects/scripts/com/logger.shrc
/root/projects/scripts/com/utils.shrc

実行に際しては、ファイルの配置だけでなく、ログディレクトリの書き込み権限やdnfによるインターネット接続も必要になります。環境に応じた事前準備を整えたうえで、実行を行ってください。

設定される主要項目の分類と処理内容

このスクリプトでは、開発サーバーに必要な初期設定を一括で実行する設計になっています。処理内容はカテゴリごとに整理されており、セキュリティの強化、環境設定の最適化、開発ツールの導入といった多岐にわたる作業が順序立てて自動適用されます。

設定項目

  1. SELinux 無効化
  2. タイムゾーン設定(Asia/Tokyo)
  3. ロケール設定(ja_JP.UTF-8)
  4. ホスト名設定
  5. ファイアウォール設定
  6. rootログインを禁止設定
  7. IPv6 を無効化設定 パッケージのアップデート
  8. パッケージメタデータの事前キャッシュ
  9. 必要パッケージのインストール
  10. chronyd の設定
  11. limits.conf 設定
  12. ファイルディスクリプタ
  13. 上限緩和
  14. sysctl 設定
  15. crond 設定

3つの分類に沿って処理内容を解説します。

セキュリティ関連(SELinux、SSH、firewalld、IPv6)

このカテゴリでは、サーバーの基本的な防御状態を構築するための設定を行います。対象はSELinuxの制御、SSHによるrootログインの禁止、ファイアウォールの有効化とポート制限、そしてIPv6の無効化です。これらは初期構築時に必ず適用すべきセキュリティ項目であり、本スクリプトではそれらを確実に反映します。

No設定項目初期設定値備考
1SELinux無効化SELINUX=disabled/etc/selinux/config
2ファイアウォール設定22, 80, 443, 5000-5003 を開放firewalld 有効化済
3SSH設定変更PermitRootLogin no/etc/ssh/sshd_config
4IPv6無効化disable_ipv6 = 1(all, default)/etc/sysctl.conf に追記

環境設定(タイムゾーン、ロケール、ホスト名)

タイムゾーンやロケール、ホスト名といった設定は、ログの可読性や運用時の識別に関わる重要な要素です。本スクリプトでは、国内開発環境に適した構成となるよう、すべてのサーバーに同一の設定を適用します。

No設定項目初期設定値備考
1タイムゾーン設定Asia/Tokyo に変更timedatectl により反映
2ロケール設定LANG=ja_JP.UTF-8glibc-langpack-ja を導入
3ホスト名変更dev01 に固定hostnamectl により変更

開発ツール・パッケージの導入

サーバー構築直後に必要なユーティリティを一括で導入します。dnfを使ってパッケージを更新し、依存性解決のためのキャッシュを生成したうえで、vimやgitなどの開発ツールを導入します。これにより、サーバー起動直後から開発や運用作業に着手できる状態が整います。

No設定項目初期設定値備考
1パッケージ更新全パッケージを最新化dnf により更新
2dnfキャッシュmakecache --refresh を実行依存関係の解決高速化
3開発ツール導入vim, curl, git, rsync などdnf install により一括導入

カーネル・リソース制御の最適化設定

本スクリプトでは、初期構築直後のサーバーに対して、プロセス制限やネットワークバッファなどのカーネル・リソースパラメータを調整しています。これにより、突発的な高負荷時にもプロセスが異常終了しにくくなり、同時接続やソケット通信の安定性が向上します。 このセクションでは、制限の緩和とチューニングを対象とした3つの処理内容について説明します。

limits.conf による上限変更

まず、`/etc/security/limits.conf` に対してnofile制限(オープン可能なファイルディスクリプタ数)を拡張します。これはWebサーバーやデーモンプロセスが同時に多数のファイルやソケットを開くケースに備えるための設定です。

No設定項目初期設定値備考
1プロセス数上限変更nofile soft/hard = 65535/etc/security/limits.conf

この設定により、ユーザー単位の同時ファイル数が大幅に拡張され、特に大量ログ生成や多接続処理に強い構成となります。

ulimit の永続化設定

`ulimit -n` はセッション単位でファイルディスクリプタの上限を変更できますが、再起動で元に戻るため永続化が必要です。本スクリプトでは `/etc/sysconfig/init` に追記を行い、恒久的にulimitが適用されるようにしています。

No設定項目初期設定値備考
1ulimit設定ulimit -n 65535/etc/sysconfig/init に追記

この設定により、システムの再起動後も一貫して同じリソース上限が適用され、安定した動作を継続できます。

sysctl.conf によるパフォーマンス調整

ネットワーク性能やソケットの同時接続性を向上させるため、`/etc/sysctl.conf` に複数のカーネルパラメータを一括で追加します。主にTCPキューの深さやポート範囲、タイムアウト関連のチューニングです。

No設定項目初期設定値備考
1カーネルパラメータ設定下記7項目を /etc/sysctl.conf に追記再起動不要。sysctl -p で即時反映

以下は実際に追加される設定値です。

net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.core.netdev_max_backlog = 65535
net.ipv4.ip_local_port_range = 10240 65535
net.ipv4.ip_local_reserved_ports = 23364,27017
net.ipv4.tcp_keepalive_time = 120
net.ipv4.tcp_keepalive_intvl = 30

これらの設定は、アプリケーションの大量接続時のリスクを軽減し、タイムアウトのバランスを調整することに貢献します。

このスクリプトはすべての処理において冪等性が確保されており、再実行しても設定結果にばらつきが生じることはありません。

スクリプト全体の実行設計と再実行時の挙動

このスクリプトは、一度実行するだけで開発サーバーに必要な初期設定をすべて完了させる構成になっています。途中停止や設定競合を避けるために、ログ管理・処理分岐・再実行時の冪等性を考慮した制御設計が組み込まれています。

また、設定内容に依存せず複数回の実行にも耐えられる構造になっており、再構築や環境復元の場面でも高い信頼性を保つことができます。

前提となる実行環境

Beエンジニアでシェルスクリプトを実行する環境は下記の通りとします。

実行環境

BASE_DIR(任意のディレクトリ)

  • scripts
    • bin(実行スクリプト格納領域)
      • <<各種実行スクリプト>>.sh (実行ファイル)
    • com(共通スクリプト格納領域)
      • logger.shrc(共通ログ出力ファイル)
      • utils.shrc(共通関数定義ファイル)
    • etc(設定ファイル等の格納領域)
      • infraMessage.conf(メッセージ定義ファイル)
    • log(スクリプト実行ログの格納領域)
      • スクリプト名.log 
    • tmp(テンポラリ領域)
    • rep(レポート出力領域)

RHEL系サーバー初期構成自動化スクリプト

以下は、RHEL系Linuxで開発サーバーを構築するための初期設定スクリプトです。root権限で一度実行するだけで、必要な設定をすべて自動で適用できます。環境に応じてホスト名やポート番号などを変更してご利用ください。

このスクリプトを実行するには、共通関数ファイルである logger.shrc および utils.shrc が同一ディレクトリ内の com フォルダに配置されている必要があります。

これらのスクリプトには、ログ出力処理や汎用ユーティリティ関数が含まれており、本体スクリプトの全処理を正しく機能させるために必須です。

処理の実行順序とエラーハンドリング

スクリプトは1番から順に処理を進める直列実行型で、各セクションには処理開始と終了のログ出力が設けられています。失敗した処理が発生した場合には、即座にログを出力し、エラーコードとともにスクリプトを終了します。

startLog
logOut "ERROR" "設定失敗内容"
exitLog 2

このように明示的に終了ポイントを設けることで、エラーの位置を特定しやすく、修正にも時間がかかりません。

冪等性の確保(何度実行しても一貫する構造)

本スクリプトは、再実行した場合でも常に同じ設定結果が得られるように設計されています。たとえば、設定ファイルへの追記はすでに記述があるかどうかを検出したうえで行われ、無駄な追記や重複が発生しないよう制御されています。

if ! grep -q "ulimit -n 65535" "$init_conf"; then
    echo "ulimit -n 65535" >> "$init_conf"
fi

この構造により、複数回のスクリプト実行やCI環境での再デプロイ時にも、予測可能かつ安全に動作します。

ログ出力とデバッグ性の確保

各処理ステップでは、ログ出力関数を通じて標準出力およびログファイルへの記録が行われます。ログレベルは `INFO` を標準とし、必要に応じて `DEBUG` に変更可能です。ログの出力先も `CONSOLE` と `FILE` を切り替えられる柔軟な設計です。

LOG_MODE="overwrite"
DEFAULT_LOG_MODE="CONSOLE"
logOut "INFO" "ファイアウォール設定を開始します"

実行結果を可視化することで、構築作業の透明性が高まり、トラブル時の原因調査や運用レポートにも活用できます。

本サイトにて記載のすべてのスクリプト利用により発生した利用者の損害全てに対し、いかなる責任をも負わないものとし、損害賠償をする一切の義務はないものとします。また、この記事は、実際の案件対応を通じて得た知見をもとに筆者が作成したものであり、全コードと解説は著者本人による設計・検証結果に基づいています。

よく読まれている記事

1

IT入門シリーズ 🟢 STEP 1: ITの基礎を知る(ITとは何か?) 📌 IT初心者が最初に学ぶべき基本知識。ITの概念、ネットワーク、OS、クラウドの仕組みを学ぶ ...

2

「私たちが日々利用しているスマートフォンやインターネット、そしてスーパーコンピュータやクラウドサービス――これらの多くがLinuxの力で動いていることをご存じですか? 無料で使えるだけでなく、高い柔軟 ...

3

この記事は、Linuxについて勉強している初心者の方向けに「Shellスクリプト」について解説します。最後まで読んで頂けましたら、Shellスクリプトはどのような役割を担っているのか?を理解出来るよう ...

-運用自動化ツール