0

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 bfromを含めるのはばかげていることを理解しています。私が理解できないのは、定義された(名前が「2」のインスタンス)からのexecが、解析順序に関してクラス「a」のに表示されるにもかかわらず、評価されたバージョンを持っている理由です。class atype c$b::x

これを説明する唯一のことは、定義された型がいつ解析されるかという点で遅れた場合ですか? この場合、これ (またはどこか) に関する puppetlabs のドキュメントはありますか、および/またはソースのどの部分が標準型リソースと定義済み型リソースを区別していますか? (私はそれを見つけようとしましcompiler.rbたが失敗しました)。

4

2 に答える 2

0

順番に実行する必要があるリソースの依存関係がある場合は、 before または require を使用します。

http://docs.puppetlabs.com/learning/ordering.html#before-and-require

于 2013-07-17T22:58:19.323 に答える
0

この問題は、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 の次のバージョンで壊れる可能性があります。

于 2013-09-25T18:35:50.253 に答える