数十台のサーバーを手動で管理する苦労
30〜50台のサーバークラスターの各ノードにSSHでログインし、dnf update を入力したりセキュリティ脆弱性をチェックしたりする作業は、まさに悪夢です。半年前、弊社のシステムが急速に拡大した結果、CentOS 7、Rocky Linux 8、CentOS Stream 9 が混在し、バージョン管理が混乱状態に陥りました。どのパッケージを本番環境(production)に適用してよいかを制御するのは、ほぼ不可能な状態でした。
Red Hat Satellite(高額なライセンス費用)や Uyuni を検討した結果、私は Foreman と Katello の組み合わせを選択しました。Foreman はライフサイクル管理(provisioning)を、Katello はリポジトリ、コンテンツビュー(Content View)、およびエラッタ(Errata/パッチ)の管理を強力にサポートしてくれるツールです。
実体験からの教訓:Foreman を単なるインストールツールと考えないでください。これは、Linux インフラ全体の「信頼できる唯一の情報源(Single Source of Truth)」となります。以下に、CentOS Stream 9 での構築プロセスを紹介します。
システム要件(I/O パフォーマンスを優先)
Foreman と Katello は、PostgreSQL、Candlepin、Pulp を同時に実行するため、非常に多くのリソースを消費します。リポジトリの同期中にシステムがフリーズするのを避けるため、低スペックな構成での運用は避けましょう。私の経験に基づく推奨構成は以下の通りです:
- CPU: 最小 4コア(100台以上のクライアントを管理する場合は 8コア推奨)。
- RAM: 12GB – 16GB(8GB 未満だと、Candlepin の Java サービスが OOM – Out of Memory になりやすいです)。
- Disk:
/var/lib/pulp用に最低 100GB。複数の OS バージョンを同期する場合は 300-500GB 用意してください。 - Network: 固定 IP と正確な FQDN が必須です。
ステップ 1:ホスト名とファイアウォールの設定
Foreman はサーバーの識別名に対して非常に敏感です。ホスト名の逆引き(reverse lookup)ができないだけで、インストーラーは即座にエラーを出します。独自の DNS サーバーがない場合は、/etc/hosts ファイルを慎重に設定してください:
# FQDNの設定
hostnamectl set-hostname foreman.itfromzero.local
# 内部IPの定義
echo "192.168.1.100 foreman.itfromzero.local foreman" >> /etc/hosts
次に、システムを更新し、必要なサービスポートを開放します。Katello はクライアントとの通信に多くのポートを必要とします:
dnf update -y
firewall-cmd --permanent --add-service={http,https,dns,dhcp,dhcpv6,tftp,mcollective,puppetmaster,proxy-dhcp}
firewall-cmd --reload
ステップ 2:Foreman および Katello のリポジトリ設定
CentOS Stream 9 では、Foreman プロジェクトと Puppet の公式リポジトリを有効にする必要があります。Katello と Foreman のバージョンの互換性は非常に重要なので注意してください。
# リポジトリソースのインストール
dnf install -y https://yum.theforeman.org/releases/3.9/el9/x86_64/foreman-release.rpm
dnf install -y https://yum.theforeman.org/katello/4.11/katello/el9/x86_64/katello-repos-latest.rpm
dnf install -y https://yum.puppet.com/puppet7-release-el-9.noarch.rpm
# 適切な Ruby および PostgreSQL モジュールの有効化
dnf module enable ruby:3.1 -y
dnf module enable postgresql:13 -y
ステップ 3:Foreman インストーラーの実行
各コンポーネントを手動でインストールする代わりに、Foreman は Puppet を使用した強力な実行スクリプトを提供しています。コンテンツ管理機能をフルに活用するため、katello シナリオを使用します。
dnf install -y foreman-installer-katello
foreman-installer --scenario katello \
--foreman-initial-admin-username admin \
--foreman-initial-admin-password YourSecurePassword \
--foreman-proxy-dns=false \
--foreman-proxy-dhcp=false
注意: 既存のサーバーでこれらのサービスを管理しているため、DNS と DHCP プロキシは false に設定しています。インストールプロセスは、ディスク速度によりますが、通常 20 分から 40 分ほどかかります。
ステップ 4:コンテンツ管理(運用のポイント)
ダッシュボードにアクセスできたら、すぐにホストを追加しないでください。まずは Organization(組織)と Location(ロケーション)を設定し、最初から論理的に管理できるようにしましょう。
1. 賢いリポジトリ同期
Content > Products セクションで BaseOS や AppStream などのリポジトリを追加する際、ダウンロードポリシー(download policy)を “On Demand” にすることをお勧めします。これにより、クライアントが実際に要求したパッケージのみをダウンロードするため、数十GB のディスク容量を節約できます。
2. Content Views — 安全のための防波堤
これは Katello の最も価値のある機能です。Content View を使用すると、ソフトウェアの「スナップショット」を作成できます。
- 開発環境(Dev): 毎日最新のパッチを適用。
- 本番環境(Prod): 2週間前に安定性が確認されたパッチのみを適用。
ゼロデイ脆弱性が発生した際も、Content View を更新して「Promote(昇格)」させるだけで、数クリックで Dev から Prod へ反映できます。
ステップ 5:クライアントの接続とエラッタの監視
新しいサーバーを管理するために、複雑なインストール作業は不要です。Hosts > Register Host メニューにある global registration 機能を使用します。
# クライアントマシンで登録スクリプトを実行
curl -X GET -k https://foreman.itfromzero.local/register_host_script > register.sh
chmod +x register.sh
./register.sh
登録が完了すると、不足しているパッチ(Errata)の情報が Web UI 上に直感的に表示されます。各サーバーに SSH でログインしなくても、どのサーバーにセキュリティ脆弱性があるかを正確に把握できます。
6ヶ月間の運用まとめ
システムは安定稼働しており、定期メンテナンス時間を約 80% 削減できました。ただし、以下の点に注意してください:
- タスクの定期的なクリーンアップ: Katello は大量のタスクログを生成します。Monitor > Tasks から古いデータを削除し、PostgreSQL データベースが肥大化するのを防ぎましょう。
- LVM の使用: リポジトリの増加に合わせてオンラインで容量を拡張できるよう、
/var/lib/pulpディレクトリは常に LVM 上に配置してください。 - バックアップは不可欠: システムのアップグレード前には必ず
foreman-maintain backup offlineコマンドを実行してください。
Foreman + Katello の構築は最初は複雑に感じるかもしれませんが、集中管理とシステムの安全性によって得られる価値は、費やした労力に見合う十分なものです。
