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

5

我知道我们可以指定资源之间的关系,以确定部署顺序。但是,在Puppet中是否可以在不同节点之间创建资源关系?

例如,我在节点A上有apache Web服务器,在节点B上有mysql服务器。我想先启动mysql,然后再启动apache Web服务器。如何在Puppet语言中表达这一点呢?


我尝试了以下代码:

node ‘host1’ {
  @@service { ‘mysql’:
    ensure => running,
    tag => ‘host1-mysql’,
  }
}
node ‘host2’ {
  service { ‘apache2’:
    ensure => running,
  }
  Service<<| tag == ‘host1-mysql’ |>> -> Service[‘apache2’]
}

但是它并没有起作用 - 产生了编译错误。还有其他的解决方案吗?

有人能告诉我为什么这个问题会被评为-1吗? - Herry
你应该同时发布错误信息。 - xiankai
4个回答

5
在分布式“puppet”设置中,应用程序的顺序不能保证。
Puppet不会在多个节点之间进行编排。最好的情况是,在机器上多次应用更改,并最终收敛到所需状态。
依赖关系仅在同一节点中起作用。您实际上可以获取其他节点导出的资源的值(例如,配置防火墙以允许Web服务器执行SQL的数据库),或者使用hiera欺骗了解谁具有“db”和“app”角色。
要进行编排,请参见mcollective,capistrano,ansible等工具。

感谢 @mestachs 的澄清。 - Herry

0

仅使用Puppet无法做到这一点。从概念上讲,使用Puppet生成节点配置的静态描述,然后应用它。导出资源系统很方便,但并没有根本改变Puppet的工作方式(您可以通过注意到您可以硬编码资源来说服自己,这将具有完全相同的效果)。

因此,您需要另一种编排系统,并且不应在服务上设置enable => running

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

  • 我只使用了heartbeat,在我的经验中很难配置,不可靠且非常有限(仅支持少数节点)。
  • Ubuntu有一个juju工具,可以实现您想要的功能,似乎很容易使用,但我没有使用过。
  • 您选择的发行版中可能有类似的东西。

0
每当一个资源依赖于另一个资源时,请使用 before 或 require metaparameter 或使用链式资源 ->。每当一个资源需要在另一个资源更改时进行刷新,请使用 notify 或 subscribe metaparameter 或链式资源 ~>。有些资源会自动要求其他资源,如果它们看到这些资源,这可以节省一些精力。
请参阅link以获得更多准确信息。
在init.pp中您声明/实例化这些类的地方,请用参数化类语法替换include语句: class {"taskname":} -> class {"taskname2":} 这将确保在调用taskname2之前首先调用taskname。
请查看link

我尝试使用这个链式箭头,但我认为每当资源在不同的节点上时它都无法工作。 - Herry

0

搜索 puppet node dependency 会出现一些关于导出资源的链接,这似乎是正确的方法。

根据 http://docs.puppetlabs.com/puppet/latest/reference/lang_exported.html 的说法:

导出资源允许节点彼此共享信息。

基本上,在节点中导出资源,并在需要它的节点中收集它并像往常一样使用依赖箭头。

MCollective 似乎也是一种替代方案,但似乎是一个全新的框架。


我尝试使用导出的资源和“关系”或“链接箭头”(请参见编辑问题中的示例)。但是它没有起作用 - 产生了编译错误。 - Herry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接