2013-12-12 12 views
7

Kullanıcıların kendi bash_profile.local kaynaklarını sağlamasına izin vermek için bir vagrant VM hazırlamaya çalışıyorum ancak bu dosyanın vm'nin vcs repo'sunda izlenmesi istemiyorum. Yeniden adlandırabilecekleri bir bash_profile.local.dist dosyası var. Kuklaya, kaynak dosya mevcutsa sadece bir dosya oluşturmasını nasıl söyleyebilirim? Şu anda düzgün çalışıyor ancak sağlama sırasında bir hata kaydeder ve bu kaçınmaya çalışıyorum. Bu şekilde her dosyayı kötüye olabilirKukla kopyalamayı sadece kaynak varsa nasıl yapabilirim?

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', 
    } 
} 

cevap

10

:

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

Teşekkürler, teşekkürler. Birisi bunu okuyor ve neler olup bittiğini merak ediyorsa, dosya() her dosya, başarılı olana kadar sırayla okumaya çalışacaktır, böylece ilk dosya yoksa, '' döndüren/dev/null değerini okuyacaktır. – pdizz

+1

Neden dosya kaynağı ve bash sınaması [function] (http://ryanuber.com/04-17-2010/conditional-file-creation-puppet.html)? – mestachs

+0

Bu harika, ancak kodu bu yanıtta kopyalayıp yoldaki bir değişkeni yapıştırırsanız, tek tırnakların değişkenlerin yorumlanmadığı anlamına geldiğini eklemek isterim. Bir değişken kullanıyorsanız, tek tırnak işaretlerini çift tırnak olarak değiştirin. (-: –

4

Bu istedi ama size böylece, kaynağa birden fazla yolu sağlayabilmektedir şey bu değildi

Bu

tezahür Kullanıcının kendisinin tedarik etmemesi durumunda varsayılan boş bir dosya olabilir. admin "modüller/bash_profile.local/yerel" in ".bash_profile.local" mevcut bir kopyasını yoksa,

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

Böyle bir şey deneyebilirsiniz dosya kaynağı ikinci kaynağı kullanacak ve daha sonra boş bir dosya oluşturacaktır. Ardından, "onlyif" testi başarısız olur ve exec işe ​​yaramaz boş dosyayı kaldıracaktır.

Bu şekilde kullanıldığında, bu kod biraz hantal olabilir, ancak bir yetkilendirme hatasından daha iyidir. Durumunuzda boş bir .bash_profile.local dosyasının saklanmasının uygun olup olmadığını değerlendirebilirsiniz. Normalde, bir kaynak olarak mevcut değilse, dosyanın internetten yeni bir kopyasını almak için rm yerine wget ile bir varyasyonu kullanırım.

Eğer puppetmaster kullanıyorsanız, .bash_profile.local ifadesine göre kataloğun iki sürümünü sunan, kendi sunucusunu sağlamak için bunu kullanabileceğinizi unutmayın.