我在将Debian buster回购软件包安装到具有两个存储库的系统中时遇到问题,该问题将影响我们使用puppet部署的大多数软件包。 Puppet尝试从我们的本地存储库安装它。
我们正在硬件和VM上使用Ubuntu 16运行多个Ganeti集群。现在我们决定将硬件迁移到Debian stable。我们在公司内有一个本地仓库,以提供我们的特定软件包以及一些Ubuntu软件包。在测试阶段,我使用Debian和一些VM建立了一个新的Ganeti集群。
我正在使用的代码如下:
package { 'haproxy':
ensure => latest,
}
在VM上,我手动安装了软件包haproxy
,因为我遇到了下面描述的错误,并且我尝试查看如果该软件包已经存在于系统中会发生什么,因此我有以下情况: / p>
# 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
.....
.....
.....
当我在节点上运行人偶代理时,我得到一个错误:
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.
因此,很显然,up试图将软件包升级到与软件包资源中的1.8.19-1ppa1~xenial
有关的latest
。
我不想将sure属性更改为installed
或present
,而是试图使代码在Ubuntu(以及它)和Debian上均能正常工作。
更改Pin-Priority
也不是一个好主意,因为我们需要将本地存储库中的一些标准软件包安装在每个系统上,而无需修改每个模块中的the代码。
我唯一想到的工作是添加属性install_options
,以便包资源如下(我尚未对其进行测试):
if $facts['operatingsystem'] == 'Debain' {
package { 'haproxy':
ensure => latest,
install_options => ['-t', 'buster'],
}
} else {
package { 'haproxy':
ensure => latest,
}
}
但是,这意味着我必须避免发生冲突时修改每个模块中的所有程序包资源。
有没有更好的方法来实现这一目标?
谢谢
答案 0 :(得分:3)
如果您是从命令行手动安装软件包的,则取决于您描述的存储库配置,那么您每次都需要提供命令行选项,对吗?您可能需要指定特定的软件包版本或调制源列表。
木偶对此没有神奇的解决方案。如果需要针对特定软件包覆盖存储库配置,则需要一种或另一种方式在受影响的Package
资源上提供适合该目的的属性。方法有两种基本途径:
更新您的存储库配置,以便您不需要。例如,也许您可以将本地存储库分为两部分,一类的优先级低于发行版,另一类的优先级更高。或者也许您需要Debian而不是Ubuntu的单独仓库。或
修改Puppet清单中声明的Package
资源,可能以发行版特定的方式。尽管您可以使用条件语句来实现任何所需的发行版专用性,但我还是建议您采用一种依靠参数化类和Hiera的数据驱动方法。