cloud-init
エラーが発生せずに正しく機能するまで、他の操作を再試行して以下に示すエラーメッセージを処理するには、以下の抜粋スクリプトでどの特定の構文を変更する必要がありますか?
エラーが発生したコマンドは次のとおりです。
エラーの原因と思われる起動スクリプトのコマンドは次のとおりです。
dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
エラーメッセージ:
エラーメッセージは次のとおりです。
azure-arm: Errors during downloading metadata for repository 'epel':
azure-arm: - Status code: 503 for https://mirrors.fedoraproject.org/metalink?repo=epel-8&arch=x86_64&infra=$infra&content=$contentdir (IP: 123.45.678.901)
azure-arm: - Status code: 503 for https://mirrors.fedoraproject.org/metalink?repo=epel-8&arch=x86_64&infra=$infra&content=$contentdir (IP: 123.45.678.908)
azure-arm: - Status code: 503 for https://mirrors.fedoraproject.org/metalink?repo=epel-8&arch=x86_64&infra=$infra&content=$contentdir (IP: 98.765.43.21)
azure-arm: Error: Failed to download metadata for repo 'epel': Cannot prepare internal mirrorlist: Status code: 503 for https://mirrors.fedoraproject.org/metalink?repo=epel-8&arch=x86_64&infra=$infra&content=$contentdir (IP: 86.753.09.11)
コンテキスト
Packerは起動スクリプトを使用してAzureからRHEL 7イメージを構築しますcloud-init
。通常、ビルドはうまく機能します。ただし、一部の依存関係の問題により、下の行で以下のエラーが発生した場合、ビルドは失敗します。
設置がスムーズに完了するために、切断線の周りの線をどのように書き直す必要がありますか?
dnf install
私たちの要件は、以下のように特定のファイルで直接作業を行うことですがrpm
、まれにrpmに提供されたURLが正しく応答しない場合、プロセスが失敗するのを防ぐためにどのように変更できますか?
ビルドを含む自動化は、このエラーが発生した時点まで実行するのに長い時間がかかります。
したがって、このエラーを処理すると、長い自動化プロセスを再実行する必要がなくなり、無駄な時間が大幅に短縮されます。
@Haxiel
提案されたコードの結果:
以下の投稿された回答で提案されたコードを試しましたが、次@Haxiel
のエラーが発生しました。
このエラーを解決し、このOPに投稿された元の質問を解決するには、どの特定の構文を変更する必要がありますか?
azure-arm: + for repourl in "https://fedora.cu.be/epel" "https://lon.mirror.rackspace.com/epel" "https://ftp.yz.yamagata-u.ac.jp/pub/linux/fedora-projects/epel"
azure-arm: + curl --silent --fail --max-time 5 https://fedora.cu.be/epel
azure-arm: + echo 'Repository reachable.'
azure-arm: Repository reachable.
azure-arm: + for repourl in "https://fedora.cu.be/epel" "https://lon.mirror.rackspace.com/epel" "https://ftp.yz.yamagata-u.ac.jp/pub/linux/fedora-projects/epel"
azure-arm: + curl --silent --fail --max-time 5 https://lon.mirror.rackspace.com/epel
azure-arm: + echo 'Repository reachable.'
azure-arm: Repository reachable.
azure-arm: + for repourl in "https://fedora.cu.be/epel" "https://lon.mirror.rackspace.com/epel" "https://ftp.yz.yamagata-u.ac.jp/pub/linux/fedora-projects/epel"
azure-arm: + curl --silent --fail --max-time 5 https://ftp.yz.yamagata-u.ac.jp/pub/linux/fedora-projects/epel
azure-arm: + echo 'Repository reachable.'
azure-arm: Repository reachable.
azure-arm: + sudo dnf --cacheonly -y install https://ftp.yz.yamagata-u.ac.jp/pub/linux/fedora-projects/epel/epel-release-latest-8.noarch.rpm
azure-arm: Last metadata expiration check: 0:11:50 ago on Mon 07 Feb 2022 05:36:46 PM UTC.
azure-arm: epel-release-latest-8.noarch.rpm 37 kB/s | 23 kB 00:00
azure-arm: Dependencies resolved.
azure-arm: ================================================================================
azure-arm: Package Architecture Version Repository Size
azure-arm: ================================================================================
azure-arm: Installing:
azure-arm: epel-release (B noarch 8-13.el8 @commandline 23 k
azure-arm:
azure-arm: Transaction Summary
azure-arm: ================================================================================
azure-arm: Install 1 Package
azure-arm:
azure-arm: Total size: 23 k
azure-arm: Installed size: 35 k
azure-arm: Downloading Packages:
azure-arm: Running transaction check
azure-arm: Transaction check succeeded.
azure-arm: Running transaction test
azure-arm: Transaction test succeeded.
azure-arm: Running transaction
azure-arm: Preparing : 1/1
azure-arm: Installing : epel-release-8-13.el8.noarch 1/1
azure-arm: Running scriptlet: epel-release-8-13.el8.noarch 1/1
azure-arm: Verifying : epel-release-8-13.el8.noarch 1/1
azure-arm: Installed products updated.
azure-arm:
azure-arm: Installed:
azure-arm: epel-release-8-13.el8.noarch
azure-arm:
azure-arm: Complete!
azure-arm: + sed -i '/^metalink.*/d' /etc/yum.repos.d/epel-modular.repo /etc/yum.repos.d/epel-playground.repo /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel-testing-modular.repo /etc/yum.repos.d/epel-testing.repo
azure-arm: + sed -i 's|^#baseurl.*|baseurl=https://ftp.yz.yamagata-u.ac.jp/pub/linux/fedora-projects/epel|g' /etc/yum.repos.d/epel-modular.repo /etc/yum.repos.d/epel-playground.repo /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel-testing-modular.repo /etc/yum.repos.d/epel-testing.repo
azure-arm: + dnf install -y telnet
azure-arm: Extra Packages for Enterprise Linux 8 - x86_64 205 B/s | 196 B 00:00
azure-arm: Errors during downloading metadata for repository 'epel':
azure-arm: - Status code: 404 for https://ftp.yz.yamagata-u.ac.jp/pub/linux/fedora-projects/epel/repodata/repomd.xml (IP: 123.45.678.90)
azure-arm: Error: Failed to download metadata for repo 'epel': Cannot download repomd.xml: Cannot download repodata/repomd.xml: All mirrors were tried
答え1
これは私が思いついた概念証明です。これを出発点として使用できます。
for repourl in \
"https://fedora.cu.be/epel" \
"https://lon.mirror.rackspace.com/epel" \
"https://ftp.yz.yamagata-u.ac.jp/pub/linux/fedora-projects/epel"
do
if curl --silent --fail --max-time 5 $repourl &> /dev/null
then echo "Repository reachable."
fi
done
sudo dnf --cacheonly install "$repourl/epel-release-latest-8.noarch.rpm"
sed -i '/^metalink.*/d' /etc/yum.repos.d/epel*
sed -i "s|^#baseurl=https://download.example/pub/epel|baseurl=$repourl|g" /etc/yum.repos.d/epel*
EPELリポジトリミラーURLのリストから始めます。利用可能な画像は次の場所にリストされています。https://admin.fedoraproject.org/mirrormanager/。最も近い2つまたは3つのミラーを選択できます。ここでは3つのミラーをランダムに選択しました。
ループ内でHTTP GETを実行して、curl
ストレージサーバーが応答していることを確認します。この--fail
オプションを使用すると、サーバー側のエラー(HTTP 5XXエラー)が発生した場合にエラーが発生します。curl
この--max-time 5
オプションを使用すると、ジョブが中断されるまで最大5秒間続行できますcurl
。
アクセス可能なリポジトリ(3つのうち1つ以上)がある場合は、ループを中断してそのリポジトリepel-release-latest-8.noarch.rpm
からパッケージをインストールします。この--cacheonly
オプションは、既存のストレージへの依存関係を防ぐのに役立ちます。
EPELパッケージをインストールした後、特定のストレージイメージを指すようにURLを変更する必要があります。私たちはいくつかのコマンドを使ってsed
これを行います。最初は「metalink」属性を削除します。https://mirrors.fedoraproject.org。 2番目は、「baseurl」プロパティを正しく動作していることを確認した特定の画像に設定します。
すべての作業が完了したら、EPELリポジトリを使用できます。追加dnf
のコマンドは正しく機能します。