人偶找不到依赖项

时间:2018-08-02 15:48:25

标签: puppet

关系有限制吗?

我们有几个相互依赖的Puppet模块(或至少依赖于它们的软件包)。

之所以这样问,是因为现在我想订阅一些服务,以便在依赖项更新时重新启动。

问题:

Error: Failed to apply catalog: Could not find dependency Package[shibbolethsp] for Package[httpd] at /etc/puppetlabs/code/environments/development/modules/apache/manifests/instance.pp:39

模块:

# Module someco-httpd, init.pp
package['httpd'] {
  ...
  require => Package['openssl','shibbolethsp'] # can find openssl but NOT shibbolethsp
}

# Module someco-openssl, init.pp
package['openssl'] {
  ...
}

# Module someco-shibbolethsp, init.pp
package['shibbolethsp'] {
  ...
}

之所以存在资源Package[shibbolethsp]是因为如果我删除该软件包并再次运行puppet,我可以看到它已安装,但是如果我还想配置Apache(需要Package[shibbolethsp]才能正常运行)木偶失败。

因此资源存在,但是我猜Puppet无法正确解决它们?与Package[openssl]的相同关系按预期工作,并且如果openssl更新到新版本,则Apache重新启动...

这是排序/多线程问题吗?一种关系有效,另一种无效...

2 个答案:

答案 0 :(得分:0)

问题在于跨模块依赖性。其他模块中的资源与当前模块位于不同的命名空间中。因此,如果您依赖于另一个模块的资源,则必须使用完整路径,例如Other_module::Other_class_or_defined_type['bla']或在require Other_module中使用init.pp,以确保顺序正确!

注意:在site.pp中,您必须按正确的顺序定义资源!

答案 1 :(得分:-3)

  

存在资源Package[shibbolethsp]是因为如果删除   打包并再次运行puppet我可以看到它已安装,

您的观察不支持该结论。

一方面,即使目录中没有Package资源,也有可能由于运行Puppet而安装软件包。实际上,这一直在发生。它由软件包本身所表达的依赖关系驱动,其中软件包管理器(Yum,apt,。)确定要安装的软件包的依赖关系并安排安装那些也。木偶对此没有洞察力。

对于另一件事,Package[shibbolethsp]完全有可能在一个节点的目录中声明,而在不同节点的目录中没有声明。自然,如果您从第一种节点卸载shibbolethsp,则Puppet将在其下一次运行时重新安装它。这绝不能说明该软件包是在其他节点的目录中声明的。

  

但是   如果我还想配置Apache(这需要   Package[shibbolethsp]才能正常运行)人偶失败。

告诉我,不,你不是在受影响节点的目录中声明Package[shibbolethsp],尽管您的抗议相反。

  

因此资源存在,但是Puppet无法正确解决它们,我   猜测?与Package[openssl] 的关系与   预期,并且如果openssl更新到新版本,则Apache重新启动...

我没有理由认为这两种关系都无法按预期实现,但我怀疑您的期望不正确。

首先,Puppet资源和类关系与应用顺序依赖关系有关。例如。 File[/etc/foo.conf]必须在管理Service[foo]之前保持最新状态,因为否则可能无法将foo服务管理到正确的状态。这在很大程度上(尽管不是完全)与托管组件之间的功能依赖性分开。

第二,我认为您假设require资源之间的Package关系将导致在声明其需求者的情况下声明必需的Package。这是完全不正确的。同样,Puppet资源关系与应用程序顺序有关。 Puppet无法自动声明require d资源,因为它依赖于您告诉它们它们具有哪些属性,而且还因为这会产生重复声明的严重风险。

总体而言,在Puppet级别声明Package资源之间的关系很少有用,因为最好在程序包/程序包管理器级别处理程序包之间的功能依赖关系,并且通常没有其他善意应用程序顺序依赖。


如果您希望shibboleth安装在装有Apache的计算机上,则需要确保声明了适当的类。您可能还具有与软件包不同级别的一些应用程序注意事项顺序,例如,在管理Apache service 之前,您可能需要确保已安装Shibboleth,也许您还想如果shibboleth软件包或配置已更新,请重新启动服务。您应该在课程级别安排最好的安排,而不是在单个资源声明中进行安排。

例如,someco-httpd模块的httpd模块类可能包含以下内容:

# Nodes to which this class is applied require class ::shibbolethsp to be applied first
require '::shibbolethsp'

与资源的require元参数不同,它确实导致对命名类shibbolethsp的求值(可能产生Package[shibbolethsp]的声明),并且还创建了一个顺序-应用程序关系,以便首先应用shibbolethsp类。同样,应用程序顺序不是出于包/包关系的目的,而是为了涵盖httpd 服务的依赖性的更通用的类/类关系。关于安装和配置shibboleth。