5

私はこの node.pp を持っていますが、人形がそれをどのように実行するのか疑問に思っています。

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

エージェント ノードで、これを実行すると:

$ puppetd -t -d

パペットはそれを順番に実行していません。つまり、最初に ssh を実行してから postfix を実行しません...

これがなぜなのか誰か知っていますか?実行順序があまり関係ない「宣言型言語」と呼ばれているからでしょうか。

この場合、特定の方法で必要なものを宣言でき、人形はそれを実行する方法を理解しますか?

4

2 に答える 2

17

免責事項: 私は Puppet の開発者の 1 人です。

コード内の明示的または暗黙的な依存関係を除いて、一貫性のある予測不可能な順序で実行されます。subscribe明示的な依存関係は、またはメタパラメータで指定するものですrequire。暗黙の依存関係はautorequire機能に由来します。この機能は、適切な順序でファイル リソースを自動的に適用するなどのことを行います。

この理由は、言語が宣言的であるということではなく、言語が宣言的であるということです。なぜなら、根底にある問題空間のほとんどの場合、順序は問題にならないからです。

たとえば、ほとんどの人にとって、ssh の管理と postfix の管理の間にはあまり関係がありません。どちらの順序で作業を行っても、同時に作業を行っても、すべてが同じように機能します。

これにより、「すべてが直線的な順序である」場合にはない、さまざまな方法で物事を改善することができます。たとえば、パッケージの外部の明示的な依存関係を尊重しながら、パッケージのインストールをバッチ処理するように取り組んでいます。

したがって、実行の順序と依存関係は根本的な問題に従い、そのプロパティを保持して、より素晴らしいことを実行できるようにしました。

目標はまさにあなたが最後に言うことです: あなたが望むものを宣言し、私たちはそれを達成するためのすべての詳細を処理します. いずれ、論理的な依存関係についてもっとスマートになることを願っています。

于 2012-03-01T21:33:04.437 に答える
3

免責事項:私はまだ人形にかなり慣れていません:)

重要なのは、すべてを依存関係の観点から考えることです。クラスの依存関係については、Class['a'] -> Class['b'] 構文を使用するのが好きです。Oracleからsun jdkをダウンロード/インストールするjdkクラスを必要とするTomcatクラスがあるとします。Tomcat クラスでは、これを次のように指定できます。

クラス['jdk'] -> クラス['tomcat']

または、include を使用する代わりに、require メタ パラメーターを使用してクラスを宣言することもできます。

于 2012-03-01T22:10:13.133 に答える