<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Createrepo on K-Life Hack | システムアーキテクチャ &amp; DevOps</title><link>https://klifehack.com/tags/createrepo/</link><description>Recent content in Createrepo on K-Life Hack | システムアーキテクチャ &amp; DevOps</description><generator>Hugo -- gohugo.io</generator><language>ja</language><lastBuildDate>Tue, 01 Sep 2026 10:17:28 +0900</lastBuildDate><atom:link href="https://klifehack.com/tags/createrepo/index.xml" rel="self" type="application/rss+xml"/><item><title>RHEL 8におけるHAProxyのオフライン依存関係解決とローカルリポジトリ構築手順</title><link>https://klifehack.com/p/rhel8-haproxy-offline-dnf-repository-deployment/</link><pubDate>Tue, 01 Sep 2026 10:17:28 +0900</pubDate><guid>https://klifehack.com/p/rhel8-haproxy-offline-dnf-repository-deployment/</guid><description>&lt;p&gt;セキュリティ上の制約から外部ネットワークへの直接接続が制限されるエンタープライズの閉域網（エアギャップ環境）やDMZ領域において、ロードバランサであるHAProxyを新たにデプロイする際、依存ライブラリの不足によるインストールエラーは頻繁に発生する課題です。RHEL 8ではパッケージ管理システムとしてDNF（Dandified YUM）が標準採用されており、オンライン環境で事前にすべての依存関係（Dependency Graph）を解決した上でパッケージを取得し、ターゲット検証機にローカルリポジトリとして構成する運用設計が強く求められます。&lt;/p&gt;&#10;&lt;h2 id="オンライン環境におけるパッケージおよび全依存関係の抽出"&gt;オンライン環境におけるパッケージおよび全依存関係の抽出&#10;&lt;/h2&gt;&lt;p&gt;閉域網へ持ち込むパッケージ群を用意するため、まずはインターネット接続が可能な作業用ノードにてHAProxyおよびそのランタイムに必要な共有ライブラリ（&lt;code&gt;openssl-libs&lt;/code&gt;、&lt;code&gt;pcre2&lt;/code&gt;、&lt;code&gt;systemd&lt;/code&gt;等）を抽出します。&lt;/p&gt;&#10;&lt;p&gt;単にメインのRPMのみを取得するのではなく、ターゲット環境に未導入のライブラリを漏れなく収集するために&lt;code&gt;--resolve&lt;/code&gt;および&lt;code&gt;--alldeps&lt;/code&gt;オプションを組み合わせて実行します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo dnf download --resolve --alldeps --destdir&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/tmp/haproxy_rpms haproxy&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="パラメータ設定仕様"&gt;パラメータ設定仕様&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;--resolve&lt;/code&gt;: 依存関係ツリーを解析し、動作に必要なすべてのRPMファイルをダウンロード対象として特定します。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;--alldeps&lt;/code&gt;: ダウンロードを実行するホスト上に既に存在するライブラリであっても省略せず、すべての依存パッケージを取得対象として強制します。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;--destdir=/tmp/haproxy_rpms&lt;/code&gt;: ダウンロードしたRPM群を指定したディレクトリへ一括出力します。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;特定バージョン（例: &lt;code&gt;haproxy-2.2.0-1.el8&lt;/code&gt;）を明示して取得する場合は、リポジトリ内のバージョン一覧を確認した上でバージョン文字列を指定します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 利用可能な重複・過去バージョンの確認&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo dnf --showduplicates list haproxy&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 特定バージョンの明示的取得&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo dnf download --destdir&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/tmp/haproxy_rpms haproxy-2.2.0-1.el8&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="オフライン環境でのローカルリポジトリ作成と配置"&gt;オフライン環境でのローカルリポジトリ作成と配置&#10;&lt;/h2&gt;&lt;p&gt;取得したRPM群をUSBメモリや内部ストレージ経由でエアギャップ環境のターゲットサーバへ転送した後、ローカルファイルシステムベースのDNFリポジトリを初期化します。&lt;/p&gt;&#10;&lt;h3 id="1-リポジトリメタデータの生成"&gt;1. リポジトリメタデータの生成&#10;&lt;/h3&gt;&lt;p&gt;転送先のディレクトリに移動し、&lt;code&gt;createrepo&lt;/code&gt; ユーティリティを使用してXML形式のメタデータ（&lt;code&gt;repodata&lt;/code&gt;）を作成します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd /tmp/haproxy_rpms&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo createrepo .&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="2-リポジトリ定義ファイルの構成"&gt;2. リポジトリ定義ファイルの構成&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;/etc/yum.repos.d/&lt;/code&gt; 配下にローカルリポジトリを指し示す &lt;code&gt;.repo&lt;/code&gt; 設定ファイルを作成します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cat &amp;amp;lt;&amp;amp;lt; EOF | sudo tee /etc/yum.repos.d/haproxy-local.repo&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;haproxy-local&lt;span style="color:#f92672"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;name&lt;span style="color:#f92672"&gt;=&lt;/span&gt;HAProxy Local Repository&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;baseurl&lt;span style="color:#f92672"&gt;=&lt;/span&gt;file:///tmp/haproxy_rpms&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;enabled&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gpgcheck&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;EOF&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="3-ローカルリポジトリからのインストール実行"&gt;3. ローカルリポジトリからのインストール実行&#10;&lt;/h3&gt;&lt;p&gt;構成が完了したら、ローカルメタデータを参照してインストールを実行します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo dnf clean all&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo dnf install -y haproxy&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="troubleshooting"&gt;Troubleshooting&#10;&lt;/h2&gt;&lt;p&gt;オフライン環境でのローカルリポジトリ運用やパッケージ導入時、権限・SELinux・依存関係の不整合に起因する代表的なトラブルシューティング手順を以下に示します。&lt;/p&gt;&#10;&lt;h3 id="1-tmp-ディレクトリのパーミッションおよびselinuxコンテキスト拒否"&gt;1. &lt;code&gt;/tmp&lt;/code&gt; ディレクトリのパーミッションおよびSELinuxコンテキスト拒否&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;/tmp&lt;/code&gt; 配下にリポジトリを配置した場合、SELinuxのアクセス制御やシステムの一時ファイル削除ジョブ（&lt;code&gt;systemd-tmpfiles&lt;/code&gt;）によってメタデータ読み込みエラーが発生することがあります。&lt;/p&gt;&#10;&lt;p&gt;&lt;b&gt;症状例:&lt;/b&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Error: Failed to download metadata for repo &amp;#39;haproxy-local&amp;#39;: Cannot download repomd.xml: Cannot open file&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;b&gt;対処法:&lt;/b&gt;&lt;/p&gt;&#10;&lt;p&gt;リポジトリ配置先を &lt;code&gt;/opt/local_repos/haproxy&lt;/code&gt; などの永続ディレクトリへ変更し、適切なSELinuxコンテキストを再適用します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo mkdir -p /opt/local_repos/haproxy&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo mv /tmp/haproxy_rpms/* /opt/local_repos/haproxy/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo restorecon -Rv /opt/local_repos/haproxy&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;/etc/yum.repos.d/haproxy-local.repo&lt;code&gt;の&lt;/code&gt;baseurl&lt;code&gt;を&lt;/code&gt;file:///opt/local_repos/haproxy` へ更新後にキャッシュを再構築します。&lt;/p&gt;&#10;&lt;h3 id="2-gpg署名チェックエラー"&gt;2. GPG署名チェックエラー&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;gpgcheck=1&lt;/code&gt; が設定されている場合、公開鍵がインポートされていないとインストールが中断されます。&lt;/p&gt;&#10;&lt;p&gt;&lt;b&gt;対処法:&lt;/b&gt;&lt;/p&gt;&#10;&lt;p&gt;ローカルでの検証用途では &lt;code&gt;gpgcheck=0&lt;/code&gt; に設定するか、Red Hatの公式GPGキーをあらかじめインポートしておきます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="3-システム検証ログプロトコル"&gt;3. システム検証ログプロトコル&#10;&lt;/h3&gt;&lt;p&gt;デプロイ完了後、サービス状態およびシステムソケットの正常性を確認するターミナル検証コマンドと実行ログの例です。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ sudo systemctl enable --now haproxy&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Created symlink /etc/systemd/system/multi-user.target.wants/haproxy.service -&amp;amp;gt; /usr/lib/systemd/system/haproxy.service.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ sudo systemctl status haproxy&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;● haproxy.service - HAProxy Load Balancer&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Loaded: loaded (/usr/lib/systemd/system/haproxy.service; enabled; vendor preset: disabled)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Active: active (running) since Tue 2026-09-01 10:15:30 KST; 12s ago&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Main PID: 14820 (haproxy)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Tasks: 2 (limit: 23800)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Memory: 7.4M&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGroup: /system.slice/haproxy.service&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ├─14820 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; └─14822 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ haproxy -v&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;HA-Proxy version 2.2.9-3.el8 2021/08/10&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Configuration file is /etc/haproxy/haproxy.cfg&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="configuration-notes"&gt;Configuration Notes&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;b&gt;パッケージ依存関係の完全性確保&lt;/b&gt;: ステージング環境で &lt;code&gt;dnf download --resolve --alldeps&lt;/code&gt; を実行する際は、可能な限りターゲット環境と同等のOSビルドバージョン・最小構成（Minimal Install）のノードを利用することで、依存ライブラリの取りこぼしを防止できます。&lt;/li&gt;&#10;&lt;li&gt;&lt;b&gt;リポジトリインデックスの定期的更新&lt;/b&gt;: パッケージを追加または差し替えた場合は、必ず &lt;code&gt;createrepo --update /opt/local_repos/haproxy&lt;/code&gt; を実行してメタデータインデックスを再計算してください。&lt;/li&gt;&#10;&lt;li&gt;&lt;b&gt;セキュリティポリシーとの整合&lt;/b&gt;: 本番運用においては、&lt;code&gt;gpgcheck=1&lt;/code&gt; を維持し、ダウンロードしたRPMに対するチェックサム比較および署名検証プロセスの自動化を推奨します。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;</description></item></channel></rss>