木偶执行流程

时间:2012-03-01 20:52:07

标签: puppet

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

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

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

$ puppetd -t -d

木偶没有顺序执行它意味着,它不首先执行ssh,然后是postfix,...

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

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

2 个答案:

答案 0 :(得分:17)

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

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

原因并不是语言是声明性的,而是语言是声明性的,因为顺序对于底层问题空间中的大多数事情都无关紧要。

例如,对于大多数人来说,管理ssh和管理postfix之间确实没有多少联系 - 你可以按任意顺序完成工作,甚至可以同时完成工作,而且一切都会有相同的效果。

这使我们能够在很多方面改善事物,“一切都按线性顺序”不会。例如,我们正在努力批量打包软件包,同时仍然尊重软件包外的显式依赖关系。

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

目标正是你最后所说的:你声明你想要的东西,我们会把所有细节都放在那里。我们希望能够更加智能地理解逻辑依赖关系,所以你不得不说得更少。

答案 1 :(得分:3)

免责声明:我对木偶仍然很陌生:)

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

指定它

Class ['jdk'] - >类[ '的Tomcat']

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