2016-08-18 2 views
0

これは非常に一般的なシナリオだと思いますが、私のニーズを満たす解決策は見つかりませんでした。私は以下のように動作するものを作りたいと思っています。 (残念ながらは存在しませんをset_variable_only_if_file_was_changed)幹部は=>真のrefreshOnlyを用いて抑制することができますどのように私が見てきたファイルが変更されたときにのみ、人形のリソースタイプを実行します。

file { 'file1': 
     path => "fo/file1", 
     ensure => present, 
     source => "puppet:///modules/bar/file1", 
     set_variable_only_if_file_was_changed => $file_change = true 
} 

if $file_change{ 
    file{'new file1' 
     ... 
    } 
    exec{'do something1' 
     ... 
    } 
    package{'my package' 
     ... 
    } 
} 

が、ファイルとそれは難しいようです。私は.shファイルにコードを入れずにexecで実行したいと思います。

+1

私はこれが私の頭の上の人形では可能ではないと信じています。これは、出力をキャプチャし、それを使用して将来のタスクのための 'when'条件を作成することによって可能です。 @Cezそれは彼がここで求めているものではありません。 –

答えて

1

パペットには、あなたが記述する機能はありません。リフレッシュイベントに応答するリソースは、そのタイプに適した方法で行います。既存のリソースに対してカスタムリフレッシュ動作を定義するメカニズムはありません。 確かにカタログが完全に構築されていて、その中に何かが適用される前に、他のリソースを適用した結果に基づいてノードのカタログに含まれるリソースを指示する方法はありません。

さらに、多くの人がそうしているように、スクリプティングの実質的な背景を持つパペットに来ている場合は、それほど制約がありません。 PuppetのDSLはスクリプト言語ではないため、スクリプティングの面で考える人は、Puppetに対する精神的調整を行う必要があります。むしろ、機械状態記述(カタログ)の構築を記述するための言語である。このようなカタログでは、マシンのターゲット状態の詳細が、ではなく、であり、現在の状態から他の状態に移行するために必要な手順が記載されていることがわかります。考えられる例外であるExecも、そのように使用すると最も効果的です。マシンの意図した状態をそのIDと初期状態から判断できないことは非常にまれです。そうすることが難しいことさえ珍しいことではありません。

具体的な構成を達成する方法は、詳細によって異なります。多くの場合、答えはユーザー定義の事実にあります。たとえば、カタログアプリケーション中に特定のファイルが変更されたかどうかをキャプチャする代わりに、カタログビルド中に質問してそのファイルに変更されるかどうかを調べ、カタログの詳細を適切に調整できるという事実を提供します。 Puppetは、特定のリソースに対して変更が必要な場合にのみアクションを実行するため、最初はそのようなテストは必要ありません。

+0

概要:ハイレベルな設計を適切に行う場合は、この機能は必要ありません。 –

+0

ご回答いただきありがとうございます!私が解決しようとしているのは、サーバーコード(レール)がtarファイル(人形ファイルリソース)として配備され、tarファイルが抽出され(人形エグジット)、データベースが移行される(人形エグゼクティブ)。アップグレードでは、新しいタールファイルをパペットマスターにプッシュし、パペットにサーバーを更新させます。私は新しいサーバーコードが解凍されるまで古いサーバーを実行している問題を解決しようとしています。 – alfthan

+1

@alfthan、2つの選択肢が私を直撃します:(1)tarballをインストールするのではなく、アプリケーションを適切にパッケージ化して(RPM/DEB/whatever)、Puppetにビットの代わりに* package *を管理させます。または、(2)配布されたアプリケーションを調べてそのバージョンを判断し、それを使用して 'File'リソースと' Exec'リソースをカタログに入れるかどうかを判断するファクトを作成します。私は好意を傾ける(1)。 –

関連する問題