運用自動化ツール

【RHEL系Linux】PostgreSQLを自動インストールするシェルスクリプトの使い方

ジョンとの共存など、多くの作業工程で人為的ミスが発生しがちです。本記事では、PostgreSQLのインストール・削除・確認を1本のシェルスクリプトで自動化する方法を解説します。

特定バージョンの導入から、複数バージョンの共存管理、不要なバージョンのアンインストールまでをスムーズに行える仕組みとなっており、現場の手作業を極力排除した再現性の高い構成になっています。

概要と目的

PostgreSQLを複数バージョンで運用している現場では、バージョンごとのポート設定や、重複インストールの防止、削除時の依存関係など、煩雑な作業が日常的に発生します。

手動対応ではヒューマンエラーが避けられず、構成の一貫性が損なわれるケースもあります。

本記事では、こうした問題を解決するために開発したシェルスクリプトの概要と、その運用上の目的について解説します。

PostgreSQLの複数バージョン管理の課題

複数バージョンのPostgreSQLを同一ホスト上で扱う場合、以下のような問題が発生しやすくなります。

  • どのバージョンがどのポートで動作しているかを把握しづらい
  • 誤って同一ポートに重複インストールしてしまう
  • 不要なバージョンの削除が手間で後回しになりがち

このような状況が継続すると、セキュリティパッチの適用漏れや構成管理の煩雑化など、システム全体の安定性に悪影響を及ぼします。

スクリプト導入による運用改善の効果

本スクリプトを導入することで、以下のような具体的な改善効果が得られます。

  • 導入済みのPostgreSQLバージョンとポート一覧を自動取得
  • 競合ポートを事前に検出してインストールをブロック
  • 指定バージョンの安全なアンインストール処理

これにより、バージョン管理の一貫性を維持しつつ、操作ミスを未然に防ぎ、属人化した作業を排除できます

スクリプト設計と仕様

このスクリプトは、PostgreSQLのバージョンごとのインストールや削除、そして既存環境の一覧取得を効率的に行うために設計されています。現場での複数バージョン共存や、ポート競合の問題などを解決する目的で構築されたもので、再利用性とメンテナンス性を重視しています。

前提となる実行環境

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

実行環境

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

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

PostgreSQL自動構成スクリプト

PostgreSQL自動構成スクリプトは、複数バージョンのPostgreSQLを環境に合わせて導入・削除・一覧表示することができる汎用的なツールです。ポート競合の検出や、バージョン別のディレクトリ配置、自動的なサービス登録など、開発環境での運用に必要な基本機能をすべて備えています。クラスタ構成のような複雑な環境には対応していませんが、スタンドアロンでの開発用途には十分な機能を提供します。スクリプトは冪等性を重視して設計されており、安全かつ再現性のある導入作業が可能です。

注意(重要)
本スクリプトは RHEL/AlmaLinux 8 および 9 環境での動作を前提に検証しています。
AlmaLinux 10(RHEL 10 系)では、PostgreSQL 公式 PGDG リポジトリの EL10 向け提供状況によっては、インストールやバージョン共存機能が正常に動作しない場合があります。
AlmaLinux 10 上での実行は動作保証外とし、利用時は自己責任でお願いします。

パスワードはソースコード内の変数 POSTGRES_PASS に設定してください。環境やセキュリティポリシーに応じて、必要に応じて変更してください。

ディレクトリ構成と依存ファイル

スクリプトは特定のディレクトリ構成を前提とし、共通関数やログ出力処理を読み込むことで一貫した動作を確保しています。

ディレクトリ役割
scripts/bin実行スクリプト本体(install_postgres.shなど)を配置
scripts/com共通関数ファイル(utils.shrc, logger.shrc)を配置
scripts/tmpロックファイルなど一時ファイルの格納場所

依存ファイルとして以下を必ず配置しておく必要があります。

  • logger.shrc:ログ出力を制御
  • utils.shrc:共通関数(runAs, getOsなど)を提供

処理モードと引数仕様

このスクリプトは処理モードを引数で指定し、動作内容を切り替える方式を採用しています。

モード説明
install指定されたバージョンのPostgreSQLを導入
erase指定されたバージョンのPostgreSQLを削除
list導入済みバージョンとポートの一覧を表示

引数の指定例は以下のとおりです。

sh install_postgres.sh -m install -v 14 -p 5433

オプション必須説明
-m必須実行モード(install, erase, list)
-vinstall, erase時に必須PostgreSQLのバージョン(例:14)
-pinstall時に任意使用するポート番号(未指定時は5432)

グローバル変数とログ出力方式

スクリプト内ではジョブステータスや一貫性を保つためのグローバル変数を定義し、ログ出力はlogger.shrcに準拠しています。
主なグローバル変数の定義は以下の通りです。

変数名用途
JOB_OK正常終了時の戻り値(0)
JOB_ER異常終了時の戻り値(1)
LOCK_FILE同時実行防止用ロックファイル

ログ出力は以下の形式で統一されており、ログレベル、処理ステージ、メッセージが記録されます。

logOut "INFO" "PostgreSQL 14 のインストールを開始します"
logOut "ERROR" "指定ポート5432はすでに使用されています"

このように、ログ出力は自作loggerに集約されており、トレース性とデバッグ性を確保しています。

今回は開発環境における個別のデータベース利用を想定しているため、同一バージョンのPostgreSQLを複数クラスタとして並列にインストールするような構成には対応しておりません。

処理ロジックの詳細

このセクションでは、PostgreSQLインストールスクリプトにおける各モードの処理ロジックについて詳しく説明します。 installeraselist の各モードはそれぞれ異なる目的で動作し、環境や指定パラメータに応じて適切に切り替わる仕組みになっています。

installモードの処理フロー

installモードでは、指定されたバージョンのPostgreSQLをインストールし、ポート番号の競合チェックや初期設定を自動で行います。バージョンやポート指定がない場合のデフォルト値にも対応しています。

sh install_postgres.sh -m install -v 14 -p 5433

指定バージョンのPostgreSQLリポジトリ追加とパッケージ導入

導入モードの処理

  • 同一ポート利用中のインスタンスチェック

  • 初期化・設定ファイルの配置

  • systemdへの登録およびサービス起動

  • postgresユーザーの初期パスワード設定

eraseモードの処理フロー

eraseモードでは、指定バージョンのPostgreSQLをシステムから削除します。バージョンを指定しない場合は処理エラーとなるため、必ず明示的にバージョンを与える必要があります。

sh install_postgres.sh -m erase -v 14

処理の主な内容は以下のとおりです。

削除モードの処理

  • 該当バージョンのサービス停止とsystemd登録解除

  • インストールされたバイナリと設定ファイルの削除

  • データディレクトリのバックアップおよび削除

  • 競合ポートの再確認(使用中であれば削除を中止)

listモードの処理フロー

listモードは、現在導入済みのPostgreSQLバージョンと、それぞれが使用しているポート番号を一覧表示する機能です。導入されていない場合は適切なメッセージを出力します。

sh install_postgres.sh -m list

処理内容は以下の通りです。

一覧モードの処理

  • /var/lib/pgsql 以下に存在する postgresql.conf を再帰的に検索

  • 設定ファイルからポート番号とバージョンを抽出

  • インストールバージョンとポートを表形式で出力

ポート競合の検出ロジック

PostgreSQLは同一ポートで複数インスタンスを起動することができないため、ポート競合のチェックは必須です。本スクリプトでは install および erase モードの両方でこのチェックが実施されます。

競合チェックの具体的なロジックは以下のとおりです。

競合検出ロジック

  • /var/lib/pgsql 以下の postgresql.conf を検索

  • 該当ファイル内の port = 行を抽出し、数値を取得

  • 要求ポートと一致した場合は競合と判定

  • 該当するバージョン・設定ファイル名と共にエラーメッセージを出力

grep -E "^port\s*=" "$conf" | awk -F= '{gsub(/[[:space:]]/, "", $2); print $2}'

この処理により、異なるバージョンであってもポートが重複している場合には即座にエラーを返し、安全性を確保しています。

実行例と活用パターン

このセクションでは、PostgreSQLのインストール・削除・一覧表示といった基本操作に加え、複数バージョンの共存に関する注意点について、具体的なコマンド例を用いて解説します。すべての操作は、専用スクリプトを用いて簡潔に実行できます。

PostgreSQLをインストールする例

PostgreSQLを指定バージョン・任意ポートでインストールするには、下記のように実行します。

sh install_postgres.sh -m install -v 14 -p 5433

バージョン14を5433ポートでインストールする例です。ポート番号の指定がない場合はデフォルトで5432が使用されます。既存のバージョンとポートが競合していないかはスクリプト内で自動的に検出されます。

特定バージョンを削除する例

インストール済みの特定バージョンを削除するには、以下のようにバージョンを指定します。

sh install_postgres.sh -m erase -v 14

必ず-vオプションで削除対象のバージョンを明示してください。削除時にも、競合チェックロジックが走り、安全な削除が実施されます。

導入済みバージョンを一覧表示する例

現在導入されているPostgreSQLのバージョンと使用ポートを一覧表示するには、次のように実行します。

sh install_postgres.sh -m list

出力例:

--- Installed PostgreSQL Instances ---
Version: 15 => Port: 5432
Version: 16 => Port: 5434
Version: 14 => Port: 5433

このコマンドにより、スクリプトが/var/lib/pgsql/配下を探索し、見つかったすべてのインスタンスに対して設定ファイルを読み取り、ポート番号とバージョンの情報を表示します。

複数バージョン共存時の注意点

PostgreSQLは複数バージョンを同一ホスト上に共存させることが可能ですが、ポート競合とパス競合に注意が必要です。スクリプトでは下記のようなロジックで事前検出を行っています。

  • 全バージョンの設定ファイル`postgresql.conf`を探索
  • 各設定ファイルから`port`値を抽出し、重複をチェック
  • 競合が見つかった場合はエラーを出力し、処理を中断

そのため、複数バージョンを導入する際は、必ず-pオプションで異なるポート番号を明示的に指定してください。

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

よく読まれている記事

1

「シェル」と「シェルスクリプト」という言葉を聞いたことがありますか?どちらもLinuxやMacのターミナルで使われるものですが、それぞれの役割や使い方には違いがあります。 本記事では、「シェル」と「シ ...

2

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

3

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

-運用自動化ツール