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不是一个典型的软件包,所以您需要手动下载并安装它,或者添加一个包含它的存储库。而且,一个快速的谷歌不会出现一个软件包