关系有限制吗?
我们有几个相互依赖的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重新启动...
这是排序/多线程问题吗?一种关系有效,另一种无效...
答案 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。