我有这个 node.pp,我想知道 puppet 将如何执行它。
node 'agent.puppet.demo' {
include ssh
include postfix
include mysql
include apache
}
在代理节点上,当我运行它时:
$ puppetd -t -d
puppet 不是按顺序执行它的意思,它不会先执行 ssh,然后执行 postfix,...
有人知道为什么是这样吗?是不是因为它被称为“声明性语言”,其中执行顺序并不重要?
如果是这种情况,那么我可以以某种方式声明我想要的东西,puppet 会弄清楚如何执行它?
最佳答案
免责声明:我是 Puppet 的开发者之一。
它将以一致但不可预测的顺序执行它,代码中的任何显式或隐式依赖项除外。显式依赖项是您使用 subscribe
指定的内容。或 require
元参数。隐式依赖来自于 autorequire 功能,它可以按照合理的顺序自动应用文件资源。
这样做的原因不是语言是声明性的,而是语言是声明性的,因为顺序对于底层问题空间中的大多数事情并不重要。
例如,对于大多数人来说,管理 ssh 和管理 postfix 之间确实没有太多联系——您可以按任意顺序进行工作,甚至可以同时进行,一切都会一样。
这让我们可以自由地以多种方式改进事物,而“一切都处于线性顺序”则不然。例如,我们正在努力批量安装包,同时仍然尊重包外的显式依赖项。
因此,执行顺序和依赖关系遵循潜在的问题,我们保留了该属性以便能够做更多很棒的事情。
目标正是你最后所说的:你声明你想要什么,我们负责实现它的所有细节。随着时间的推移,我们希望在逻辑依赖方面变得更加聪明,所以你也不得不说得更少。
关于Puppet 执行流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9523878/