2012-03-01 58 views
5

我有这个node.pp,我想知道木偶是如何执行它的。木偶执行流程

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

在代理节点,当我运行此:

$ puppetd -t -d 

木偶不执行它顺序的意义,它并没有首先执行SSH,那么后缀,...

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

如果是这样,那么我可以以某种方式声明我想要的东西,傀儡会想出如何执行它?

回答

17

声明:我是Puppet的开发人员之一。

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

其原因不在于语言是声明性的,而是语言是声明性的,因为顺序对于底层问题空间中的大多数事物并不重要。

例如,对于大多数人来说,管理ssh和管理postfix确实没有太大的联系 - 你可以按照任意顺序或甚至同时进行工作,并且所有工作都可以实现。

这使我们能够以“一切都是线性顺序”的方式改善事物。例如,我们正在努力批量安装软件包,同时仍尊重软件包外部的显式依赖关系。

所以,执行顺序和依赖关系遵循底层问题,并且我们保留了该属性以便能够做更多的事情。

目标就是你在最后说的:你宣布你想要什么,并且我们关心所有获得它的细节。最后,我们希望能够更加聪明地理解逻辑依赖关系,所以你不得不说更少这样做。

+2

你能定义什么是*一致但不可预知的命令*?当Puppet 2.6只是重新订购步骤以及由于某些缺失的依赖关系而失败时,我们遇到了很多问题。这是不可测的。我可以强迫某种洗牌,以便我们可以正确测试它吗?我也听说新版本给出了固定的顺序。 – lzap 2012-09-18 15:25:03

+0

因此,比方说,我有一个要安装的软件包,它取决于yum.repos.d中存在的存储库。如何在安装软件包之前强制安装存储库? – Mojo 2014-02-06 22:46:30

3

免责声明:我还是很新的木偶:)

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

类[“JDK”]指定本 - >类[为“tomcat”]

或者你可以宣布一个需要元参数的一类,而不是使用包括。

+0

所以,我想我必须添加以下几行以确保依赖性得到正确应用。 Class ['apache'] - > Class ['mysql'] - > Class ['postfix'] - > Class ['ssh'] 是否有另一种方法可以完成顺序而不使独立模块相互依赖内部Require => Class ... – Maverick 2012-10-10 18:05:26

+0

你有这个倒退。类['a'] - >类['b']意味着类b需要类a。 我喜欢这样做的方式是,每个包装都在自己的模块中。每个模块都指定它自己对其他类的依赖关系。我喜欢使用基础超级类来处理所有东西都需要的东西,比如ssh。为此,我使用运行阶段来确保它始终运行。 – czervik 2012-10-10 21:16:54

+0

@czervik你介意如何将你的超级类包含在ssh之类的东西中,让它被其他类所包含吗? – memyself 2014-04-02 20:10:16