2013-12-12 10 views
7

Próbuję udostępnić maszynę wirtualną Vagrant, aby umożliwić użytkownikom dostarczanie własnego pliku bash_profile.local, ale nie chcę, aby ten plik był śledzony w repozytorium vcs na vcs. Mam śledzony plik bash_profile.local.dist, którego nazwę można zmienić. Jak mogę powiedzieć, aby marionetka tworzyła tylko plik, jeśli istnieje plik źródłowy? Obecnie działa poprawnie, ale rejestruje błąd podczas udostępniania i właśnie tego staram się uniknąć.Jak uczynić z lalek kopiowanie pliku, tylko jeśli istnieje źródło?

To jest oczywisty:

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

Odpowiedz

10

Można abuse plik w ten sposób:

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

Dobra sztuczka, dzięki. Jeśli ktokolwiek to czyta i zastanawia się, co się dzieje, file() spróbuje odczytywać każdy plik po kolei, aż się powiedzie, więc jeśli pierwszy plik nie istnieje, odczyta/dev/null, który zwróci ''. – pdizz

+1

Dlaczego nie używać opcji unless lub onlyif dla zasobu plikowego i testu bash [funkcja] (http://ryanuber.com/04-17-2010/conditional-file-creation-puppet.html)? – mestachs

+0

To świetnie, ale chciałbym dodać, że jeśli skopiujesz kod w tej odpowiedzi i wstawisz zmienną w ścieżce, pojedyncze cudzysłowy oznaczają, że zmienne nie są interpretowane. Zmień cudzysłów na podwójny cudzysłów, jeśli używasz zmiennej. (-: –

4

To nie jest dokładnie to, o co prosiłeś, ale można podać wiele ścieżek w źródle, więc może mieć domyślny pusty plik, jeśli użytkownik nie dostarczył własnego.

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

Można spróbować czegoś takiego:

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

Jeśli administrator nie zrobić kopię ".bash_profile.local" dostępny w "Moduły/local/bash_profile.local", to Zasób pliku użyje drugiego źródła, a następnie utworzy pusty plik. Następnie test "onlyif" kończy się niepowodzeniem, a exec usunie bezużyteczny pusty plik.

Wykorzystany w ten sposób ten kod może być trochę kłopotliwy, ale jest lepszy niż niepowodzenie udostępniania. Możesz ocenić, czy zachowanie pustego pliku .bash_profile.local może być w twoim przypadku w porządku. Zazwyczaj używam odmiany tego, z wget zamiast rm, aby pobrać świeżą kopię pliku z Internetu, jeśli nie została ona jeszcze udostępniona jako źródło.

Jeśli używasz puppetmaster, pamiętaj, że możesz go użyć do obsługi własnego serwera, prezentując dwie wersje katalogu, zgodnie z .bash_profile.local jest obecny lub nie.

Powiązane problemy