我有这个node.pp,我想知道puppet将如何执行它。
node 'agent.puppet.demo' {
include ssh
include postfix
include mysql
include apache
}
在代理节点上,当我运行它时:
$ puppetd -t -d
木偶没有顺序执行它意味着,它不首先执行ssh,然后是postfix,...
有谁知道这是为什么?是因为它被称为“声明性语言”。执行顺序并不重要?
如果是这种情况,那么我可以以某种方式宣布我想要的东西,木偶会弄清楚如何执行它?
答案 0 :(得分:17)
免责声明:我是Puppet的开发者之一。
它将以一致但不可预测的顺序执行它,但代码中的任何显式或隐式依赖项除外。显式依赖项是您使用subscribe
或require
元参数指定的内容。隐式依赖项来自 autorequire 功能,它可以按照合理的顺序自动应用文件资源。
原因并不是语言是声明性的,而是语言是声明性的,因为顺序对于底层问题空间中的大多数事情都无关紧要。
例如,对于大多数人来说,管理ssh和管理postfix之间确实没有多少联系 - 你可以按任意顺序完成工作,甚至可以同时完成工作,而且一切都会有相同的效果。
这使我们能够在很多方面改善事物,“一切都按线性顺序”不会。例如,我们正在努力批量打包软件包,同时仍然尊重软件包外的显式依赖关系。
因此,执行顺序和依赖关系遵循基础问题,并且我们保留了该属性以便能够执行更多令人敬畏的事情。
目标正是你最后所说的:你声明你想要的东西,我们会把所有细节都放在那里。我们希望能够更加智能地理解逻辑依赖关系,所以你不得不说得更少。
答案 1 :(得分:3)
免责声明:我对木偶仍然很陌生:)
关键是要考虑依赖性方面的一切。对于类依赖,我喜欢使用Class ['a'] - >类['b']语法。假设你有一个tomcat类,它需要一个从oracle下载/安装sun jdk的jdk类。在tomcat类中,您可以使用
指定它Class ['jdk'] - >类[ '的Tomcat']
或者,您可以使用require元参数声明一个类,而不是使用include。