下载存储库“epel”元数据时出错

下载存储库“epel”元数据时出错

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命令应该可以正常工作。

相关内容