【问题标题】:Install package from a specific repo with puppet使用 puppet 从特定 repo 安装包
【发布时间】:2019-04-22 10:05:03
【问题描述】:

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

我们在硬件和虚拟机上运行多个带有 Ubuntu 16 的 Ganeti 集群。现在我们决定将硬件转移到 Debian 稳定版。我们在公司有一个本地仓库来提供我们的特定软件包以及一些 Ubuntu 软件包。我用 Debian 和一些虚拟机建立了一个新的 Ganeti 集群,用于测试阶段。

我使用的代码如下:

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

在虚拟机上我手动安装了包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 代理时出现错误:

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 正在尝试将包升级到与包资源中的latest 相关的1.8.19-1ppa1~xenial。 我不想将 ensure 属性更改为 installedpresent,而是试图让代码在 Ubuntu(它确实如此)以及 Debian 上运行。 更改 Pin-Priority 也不是一个好主意,因为我们需要在每个系统上安装来自本地 repo 的一些标准包,而无需修改每个模块中的 puppet 代码。 我想到的唯一工作是添加属性install_options,以便包资源如下(我还没有测试过):

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

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

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

谢谢

【问题讨论】:

    标签: puppet


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 嗨,John,我肯定会在接下来的几周内创建一个单独的 Debian 存储库,这将是此类冲突的最终解决方案。但是现在我必须验证我们的 puppet 代码是否可以部署在 Debian 上以及用于不同的应用程序,因此我只会对现有代码进行微小的更改。我们为每个任务使用一个单独的模块,所以我们有专门的 apt_sources_list 模块使用 puppetlabs/apt 模块,这里的数据驱动方式有点过头了,if 或 case 语句就足够了。谢谢你的回复。
    猜你喜欢
    • 2013-01-24
    • 2013-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-19
    • 2019-10-21
    • 2021-05-27
    • 2019-08-15
    相关资源
    最近更新 更多