Puppet找不到依赖项

Puppet找不到依赖项,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/insta

关系是否有限制

我们有几个相互依赖的木偶模块(或者至少依赖于它们的包)

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

问题:

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'] {
  ...
}
资源
包[shibbolethsp]
存在,因为如果我删除包并再次运行puppet,我可以看到它已安装,但是如果我还想配置Apache(需要
包[shibbolethsp]
才能正常运行),puppet失败

所以资源是存在的,但是木偶不能正确地解决它们,我猜?与
包[openssl]
的相同关系按预期工作,如果openssl更新到新版本,Apache将重新启动

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

资源
包[shibbolethsp]
存在,因为如果我删除 重新安装程序包并运行puppet我可以看到它已安装

你的观察不支持这个结论

一方面,即使目录中没有包含包的
package
resource,但是完全有可能通过Puppet运行来安装包。事实上,这种情况经常发生。它由包本身中表示的依赖项驱动,其中包管理器(Yum、apt等)标识它正在安装的包的依赖项,并安排安装这些依赖项。傀儡对此一无所知

另一方面,
Package[shibbolethsp]
完全可以在一个节点的目录中声明,但不能在另一个节点的目录中声明。当然,如果您从第一类节点卸载shibbolethsp,Puppet将在下次运行时重新安装它。这绝不能证明包是在不同节点的目录中声明的

但是 如果我还想配置Apache(这需要
程序包[shibbolethsp]
无法正常运行)Puppet失败

这告诉我,不,您没有在受影响节点的目录中声明
Package[shibbolethsp]
,尽管您的声明与此相反

因此资源存在,但Puppet无法正确解决它们 猜测与
包[openssl]
的关系与 如果openssl更新到新版本,则预期会出现,Apache将重新启动

我看不出有任何理由认为这两种关系都没有达到预期的效果,但我怀疑你们的预期是错误的

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

其次,我认为您是在假设
require
资源之间的
require
关系将导致在声明其requirer时声明所需的
Package
s。这是完全错误的。同样,Puppet资源关系与应用程序的顺序有关。Puppet无法自动声明
所需的
d资源,因为它依赖于您告诉它它们具有哪些属性,而且这将产生重复声明的严重风险

总的来说,在Puppet级别声明
资源之间的关系很少有用,因为包之间的功能依赖关系最好在包/包管理器级别处理,并且包对之间通常没有任何其他真正的应用程序依赖关系顺序


如果希望shibboleth位于获得Apache的计算机上,那么需要确保声明了适当的类。您可能还有一些与包级别不同的应用程序注意事项顺序——例如,您可能需要确保在管理Apache服务之前安装了Shibboleth,并且如果更新了Shibboleth包或配置,您可能还希望重新启动服务。您可以在类级别而不是在单个资源声明中进行最佳安排

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

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

与资源“
需要”
元参数不同,它确实会导致对命名类“
shibbolethsp
进行求值(可能会生成
Package[shibbolethsp]
等的声明),并且它还会创建应用程序关系的顺序,以便首先应用
shibbolethsp
类。同样,应用顺序不是为了包/包关系,而是为了更一般的类/类关系,该类关系涵盖了
httpd
服务对安装和配置shibboleth的依赖性。

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


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

您确定
shibbolethsp
在您的包存储库中吗?Shibboleth不是一个典型的软件包,所以您需要手动下载并安装它,或者添加一个包含它的存储库。而且,一个快速的谷歌不会出现一个软件包