2013-12-12 2 views
7

私は、ユーザーが独自のbash_profile.localを提供できるように、迷惑メールVMをプロビジョニングしようとしていますが、このファイルをVMのvcsリポジトリで追跡したくありません。名前を変更できるbash_profile.local.distファイルがあります。どのようにして、ソースファイルが存在する場合にのみ、人形がファイルを作成するように指示できますか?現在は正しく動作していますが、プロビジョニング中にエラーが記録されます。これが回避しようとしている問題です。あなたがこの方法でファイルを悪用する可能性が人形が存在する場合にのみ、人形のコピーをファイルにする方法を教えてください。

class local 
{ 
    file { '.bash_profile.local': 
     source => 'puppet:///modules/local/bash_profile.local', 
     path => '/home/vagrant/.bash_profile.local', 
     replace => false, 
     mode => 0644, 
     owner => 'vagrant', 
     group => 'vagrant', 
    } 
} 

答えて

10

$a = file('/etc/puppet/modules/local/files/bash_profile.local','/dev/null') 
if($a != '') { 
    file { '.bash_profile.local': 
     content => $a, 
     ... 
    } 
} 
+3

ニースのトリック、ありがとう。誰かがこれを読んで何が起こっているのか疑問に思っている場合、file()は成功するまで各ファイルを順番に読み込もうとするので、最初のファイルが存在しなければ '/'を返します。 – pdizz

+1

ファイルリソースとbashテスト[関数]のunlessまたはonlyifを使用しない理由(http://ryanuber.com/04-17-2010/conditional-file-creation-puppet.html)? – mestachs

+0

これは素晴らしいことですが、この回答のコードをコピーしてパスに変数を付けると、一重引用符は変数が解釈されないことを意味します。変数を使用する場合は、一重引用符を二重引用符に変更します。 ( - : –

4

これは、あなたが尋ねたが、あなたはあなたので、ソースで複数のパスを供給できるかを正確にではありません

この

は、マニフェストでありますユーザーが自分自身を提供していない場合、デフォルトの空のファイルを持つことができます。管理者は、 『モジュール/ bash_profile.local /ローカル』の「.bash_profile.local」利用可能のコピーを作成していない場合は、

file { 'bash_profile.local': 
    ensure => present, 
    source => ['puppet:///modules/local/bash_profile.local', '/dev/null'], 
    path => '/home/vagrant/.bash_profile.local', 
    before => Exec['clean-useless-file'], 
} 
exec { 'clean-useless-file': 
    command => 'rm .bash_profile.local', 
    onlyif => 'test -s .bash_profile.local', 
    cwd  => '/home/vagrant', 
    path => '/bin:/usr/bin', 
} 

class local 
{ 
    file { '.bash_profile.local': 
     source => [ 
      'puppet:///modules/local/bash_profile.local', 
      'puppet:///modules/local/bash_profile.local.default' 
     ], 
     path => '/home/vagrant/.bash_profile.local', 
     replace => false, 
     mode => 0644, 
     owner => 'vagrant', 
     group => 'vagrant', 
    } 
} 
0

あなたはこのような何かを試すことができますファイルリソースは2番目のソースを使用して空のファイルを作成します。その後、 "onlyif"テストは失敗し、execは不要なブランクファイルを削除します。

このコードを使用すると、少し煩わしいことがありますが、プロビジョニングの失敗よりも優れています。あなたの空白の.bash_profile.localファイルをそのまま残すことができるかどうか評価することができます。私は通常、rmの代わりにwgetを使ってこのバリエーションを使用して、ソースから入手可能になっていない場合はインターネットから新しいファイルのコピーを取得します。

puppetmasterを使用している場合、.bash_profile.localが存在するかどうかに応じて、それを使用して独自のサーバーをプロビジョニングし、カタログの2つのバージョンを提示できることに注意してください。

関連する問題