Puppet:不同节点上的资源之间的关系

时间:2013-12-02 09:55:43

标签: configuration puppet

我知道我们可以指定资源之间的关系,这决定了部署顺序。但是有可能在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’]
}

但它没有用 - 产生了编译错误。还有其他解决办法吗?

4 个答案:

答案 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

不幸的是,我没有很好的建议:

  • 我只使用了心跳,根据我的经验,心跳很难配置,不可靠,而且非常有限(只支持少数几个节点)。
  • Ubuntu有一个juju工具,可以完全按照您的要求使用,并且看起来很容易使用,但我没有使用它。
  • 您选择的发行版可能有相同的内容。