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/。您可以选择距离您最近的两到三个镜子。我在这里随机挑选了三面镜子。
在循环中,我们执行 HTTP GET 来curl
查看存储库服务器是否响应。当遇到服务器端错误(HTTP 5XX 错误)时,该--fail
选项会导致失败。curl
该--max-time 5
选项允许操作持续长达 5 秒,然后curl
放弃。
一旦我们有了一个可访问的存储库(至少三个之一),我们就打破循环并epel-release-latest-8.noarch.rpm
从该存储库安装软件包。该--cacheonly
选项有助于避免对任何现有存储库的依赖。
安装 EPEL 软件包后,我们需要修复 URL 以指向特定的存储库镜像。我们通过使用几个sed
命令来做到这一点。第一个摆脱了指向的“metalink”属性https://mirrors.fedoraproject.org。第二个将“baseurl”属性设置为我们刚刚验证为正常工作的特定镜像。
所有这些完成后,EPEL 存储库就可以使用了。进一步的dnf
命令应该可以正常工作。