Puppet 傀儡定义的类型是否在标准资源之后评估其资源?

Puppet 傀儡定义的类型是否在标准资源之后评估其资源?,puppet,Puppet,当我使用puppet 2.7.22运行以下puppet清单时: Exec { logoutput => true, path => '/bin', } define c { exec {"echo [two]: ${b::x}": } } class a { exec {"echo [one]: ${b::x}": } include b } class b { $x = "asdf" } c {'two': } class {'a': } 我

当我使用puppet 2.7.22运行以下puppet清单时:

Exec {
  logoutput => true,
  path      => '/bin',
}

define c {
  exec {"echo [two]: ${b::x}": }
}

class a {
  exec {"echo [one]: ${b::x}": }
  include b
}

class b { $x = "asdf" }

c {'two': }
class {'a': }
我收到以下输出:

$ puppet apply test.pp
warning: Scope(Class[A]): Could not look up qualified variable 'b::x'; class b has not been evaluated at /tmp/l/a.pp:11
warning: Scope(Class[A]): Could not look up qualified variable 'b::x'; class b has not been evaluated at /tmp/l/a.pp:11
notice: /Stage[main]//C[two]/Exec[echo [two]: asdf]/returns: [two]: asdf
notice: /Stage[main]//C[two]/Exec[echo [two]: asdf]/returns: executed successfully
notice: /Stage[main]/A/Exec[echo [one]: ]/returns: [one]:
notice: /Stage[main]/A/Exec[echo [one]: ]/returns: executed successfully
notice: Finished catalog run in 0.15 seconds
现在我明白了木偶是按照解析顺序计算变量的。我明白,在使用b的x变量的exec之后包含来自
class a
class b
是愚蠢的我不明白的是,为什么定义的
类型c
(名为'two'的实例)中的exec有一个
$b::x
的评估版本,即使它在解析顺序上出现在类'a'之前。


唯一可以解释这一点的是,如果定义的类型在解析的时间方面发生了延迟?如果是这种情况,是否有来自puppetlabs的关于此(或任何地方)的文档和/或源代码的哪个部分将标准与定义的类型资源区分开来?(我尝试在
compiler.rb
中找到它,但失败)。

如果您有需要按顺序执行的资源依赖项,请使用before或require:


您可以使用以下命令解决此问题:

define c {
  require b
  notify {"echo [two]: ${b::x}": }
}

class a {
  require b
  notify {"echo [one]: ${b::x}": }
}

class b { $x = "asdf" }

c {'two': }
class {'a': }

我不知道为什么定义的类型没有得到警告,坦率地说,我并不在乎;这取决于Puppet编译器的工作方式。如果清单依赖于此类代码,它可能会与下一版本的Puppet中断。

Hi,before/require元参数与参数计算无关,只与资源执行有关。