5

我有这个 node.pp,我想知道 puppet 将如何执行它。

node 'agent.puppet.demo' {
    include ssh
    include postfix
    include mysql
    include apache
}

在代理节点上,当我运行它时:

$ puppetd -t -d

puppet 没有按顺序执行它的意思,它没有先执行 ssh,然后执行 postfix,...

有人知道为什么是这样吗?是因为它被称为“声明性语言”,执行顺序并不重要吗?

如果是这种情况,那么我可以以某种方式,声明我想要的东西,puppet 会弄清楚如何执行它?

4

2 回答 2

17

免责声明:我是 Puppet 的开发者之一。

它将以一致但不可预测的顺序执行它,但代码中的任何显式或隐式依赖项除外。显式依赖项是您使用subscribeor元参数指定的内容require。隐式依赖来自autorequire功能,它可以按照合理的顺序自动应用文件资源。

这样做的原因与其说是语言是声明性的,不如说是语言是声明性的,因为对于底层问题空间中的大多数事情来说,顺序并不重要。

例如,对于大多数人来说,管理 ssh 和管理 postfix 之间并没有太大的联系——你可以按任意顺序进行工作,甚至可以同时进行,一切都会一样。

这让我们可以自由地以“一切都按线性顺序”没有的方式改进事物。例如,我们正在努力批量安装软件包,同时仍然尊重软件包外部的显式依赖关系。

因此,执行顺序和依赖关系遵循潜在问题,我们保留了该属性以便能够做更多令人敬畏的事情。

目标正是你最后所说的:你声明你想要什么,我们会负责实现它的所有细节。随着时间的推移,我们希望在逻辑依赖方面变得更加聪明,所以你也不必多说。

于 2012-03-01T21:33:04.437 回答
3

免责声明:我对 puppet 还是很陌生 :)

关键是要根据依赖关系来考虑一切。对于类依赖,我喜欢使用 Class['a'] -> Class['b'] 语法。假设您有一个需要从 oracle 下载/安装 sun jdk 的 jdk 类的 tomcat 类。在您的 tomcat 类中,您可以使用

类['jdk'] -> 类['tomcat']

或者,您可以使用 require 元参数声明一个类,而不是使用 include。

于 2012-03-01T22:10:13.133 回答