我知道我们可以指定资源之间的关系,这决定了部署顺序。但是有可能在Puppet中的不同节点上创建资源之间的关系吗?
例如,我在节点A中有apache web服务器,在节点B中有mysql服务器。我想在启动apache web服务器之前先启动mysql。我怎么能用Puppet语言来表达这个?
我尝试过以下代码:
node ‘host1’ {
@@service { ‘mysql’:
ensure => running,
tag => ‘host1-mysql’,
}
}
node ‘host2’ {
service { ‘apache2’:
ensure => running,
}
Service<<| tag == ‘host1-mysql’ |>> -> Service[‘apache2’]
}
但它没有用 - 产生了编译错误。还有其他解决办法吗?
答案 0 :(得分:5)
在分布式“木偶”设置中,无法保证申请顺序。
Puppet 不跨多个节点进行编排。充其量,您的更改将在计算机上多次应用,最终将收敛到所需的状态。
依赖项仅适用于同一节点。您实际上可以获取其他节点导出的资源值(例如,配置数据库的防火墙以允许Web服务器执行sql) 或者与hiera作弊以了解谁拥有“db”和“app”角色。
对于业务流程,请参阅mcollective,capistrano,ansible等工具,...
答案 1 :(得分:0)
每当资源依赖于其他资源时,请使用before或require元参数或使用->
链接资源。每当资源需要在另一个资源发生更改时刷新,请使用notify或subscribe元参数或将资源与~>
链接起来。如果有些资源看到它们会自动获取其他资源,这可以为您节省一些时间。
有关更高的精确度,请参阅link。
在init.pp中声明/实例化这些类,用参数化类语法替换include语句:
class {"taskname":} ->
class {"taskname2":}
这将确保在taskname2之前调用taskname。
检查link
答案 2 :(得分:0)
puppet node dependency
的一些谷歌搜索显示了一些关于导出资源的链接,这似乎是要走的路。
根据http://docs.puppetlabs.com/puppet/latest/reference/lang_exported.html
导出的资源允许节点彼此共享信息。
基本上,您在其所属的节点中导出资源,并在需要它的节点中收集资源,并照常使用依赖关系箭头。
MCollective似乎也是一种替代方案,但似乎是一个全新的框架。
答案 3 :(得分:0)
你不能只使用Puppet。从概念上讲,使用Puppet生成节点配置的静态描述,然后应用它。导出的资源系统很方便,但并没有从根本上改变Puppet的工作方式(你可以通过注意你可以硬编码资源来说服自己,这将产生完全相同的效果)。
因此,您需要另一种业务流程系统,并且不应在服务上设置enable => running
。
不幸的是,我没有很好的建议: