使用 puppet 从特定的 repo 安装包

Install package from a specific repo with puppet

我在从 Debian buster 仓库安装软件包时遇到问题,该系统有两个仓库,这个问题会影响我们使用 puppet 部署的大部分软件包。 Puppet 正在尝试从我们的本地存储库安装它。

我们 运行 在硬件和 VM 上使用 Ubuntu 16 连接多个 Ganeti 集群。现在我们决定将硬件转移到 Debian 稳定版。我们在公司有一个本地仓库来提供我们的特定包以及一些 Ubuntu 包。我使用 Debian 和一些 VM 为测试阶段设置了一个新的 Ganeti 集群。

我使用的代码如下:

package { 'haproxy':
  ensure => latest,
}

在 VM 上,我手动安装了软件包 haproxy,因为我遇到了下面描述的错误,我试图查看如果该软件包已经存在于系统中会发生什么,所以我遇到了以下情况:

# apt-cache policy haproxy
haproxy:
  Installed: 1.8.19-1
  Candidate: 1.8.19-1ppa1~xenial
  Version table:
     1.8.19-1ppa1~xenial 500
        500 http://our.local.repo/local-xenial local-xenial/main amd64 Packages
 *** 1.8.19-1 500
        500 http://ftp.de.debian.org/debian buster/main amd64 Packages
        100 /var/lib/dpkg/status
  .....
  .....
  .....

当我在节点上 运行 puppet agent 时出现错误:

The following packages have unmet dependencies:
 haproxy : Depends: libssl1.0.0 (>= 1.0.2~beta3) but it is not installable
E: Unable to correct problems, you have held broken packages.
Error: /Stage[main]/puppet_haproxy::Base/Package[haproxy]/ensure: change from 1.8.19-1 to 1.8.19-1ppa1~xenial failed: Could not update: Execution of '/usr/bin/apt-get -q -y -o DPkg::Options::=--force-confold install haproxy' returned 100: Reading package lists...
Building dependency tree...
Reading state information...
Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.
The following information may help to resolve the situation:

The following packages have unmet dependencies:
 haproxy : Depends: libssl1.0.0 (>= 1.0.2~beta3) but it is not installable
E: Unable to correct problems, you have held broken packages.

很明显,puppet 正在尝试将包升级到 1.8.19-1ppa1~xenial,这与包资源中的 latest 相关。 我不想将 ensure 属性更改为 installedpresent,而是试图让代码在 Ubuntu(确实如此)和 Debian 上工作。 更改 Pin-Priority 也不是一个好主意,因为我们需要在每个系统上安装本地存储库中的一些标准包,而无需修改每个模块中的 puppet 代码。 我想到的唯一解决方法是添加属性 install_options 以便包资源如下(我还没有测试):

if $facts['operatingsystem'] == 'Debain' {
  package { 'haproxy':
    ensure          => latest,
    install_options => ['-t', 'buster'],
  }
} else {
  package { 'haproxy':
    ensure => latest,
  }
}

但这意味着我必须在发生冲突时修改每个模块中的所有包资源,这是我想避免的。

有没有更好的方法来实现这个?

谢谢

如果您从命令行手动安装包,根据您描述的存储库配置,那么您每次都需要提供一个命令行选项,对吗?您需要指定特定的包版本或调整源列表。

Puppet 对此没有神奇的解决方案。如果您需要针对特定​​包覆盖存储库配置,那么您需要以一种或另一种方式在受影响的 Package 资源上提供适合该目的的属性。有两种基本方法:

  1. 更新您的存储库配置,以便您不需要额外的选项。例如,也许您可​​以将您的本地仓库分成两份,一份的优先级低于发行版,另一份的优先级高于发行版。或者你可能需要一个单独的 Debian 仓库而不是 Ubuntu。或

  2. 修改 Package 在您的 Puppet 清单中声明的​​资源,可能是以发行版特定的方式。尽管您可以使用条件语句来实现任何所需的发行版特异性,但我建议改为依赖参数化 类 和 Hiera.

  3. 的数据驱动方法