Puppet 傀儡定义的类型是否在标准资源之后评估其资源?
当我使用puppet 2.7.22运行以下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': } 我
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元参数与参数计算无关,只与资源执行有关。