марионетка: ако един файл съществува, копирайте друг файл отгоре

Опитвам се да разбера как да накарам своя марионетен модул да работи, така че трябва да тествам дали файлът съществува на клиента, ако съществува, тогава копирайте друг файл. Ако файлът не съществува, не правете нищо. Изглежда не мога да го накарам да работи. Ето моят модул:

class web-logs::config {

  # PATH TO LOG FILES
  $passenger='/var/tmp/puppet_test/passenger'

  # PATH TO LOGROTATE CONFIGS
  $passenger_logrotate='/var/tmp/puppet_test/logrotate.d/passenger'

  exec { 'test1':
     onlyif  => "test -f $passenger",
     path    => ['/usr/bin','/usr/sbin','/bin','/sbin'],
     refreshonly => true,
  } ~>

  exec { 'test2':
     require => Class['web-logs::passenger']
  }

И Class['web-logs::passenger'] изглежда така:

class web-logs::passenger {
  file { 'passenger':                                                  
    path    => '/var/tmp/puppet_test/logrotate.d/passenger',         
    owner   => 'root',
    group   => 'root',
    mode    => '0644',
    source  => "puppet://${puppetserver}/modules/web-logs/passenger.conf",
  }
}

Всяка помощ ще бъде оценена благодаря!


person Ura718    schedule 16.07.2015    source източник
comment
Чистото решение ще включва персонализиран факт. Но наистина ми е любопитно как изобщо възниква това изискване. Би било много по-лесно Puppet да създаде файла независимо от предишното състояние.   -  person Felix Frank    schedule 19.07.2015


Отговори (2)


Изпълнението се проваля, тъй като липсва командата за изпълнение. В момента всичко се проваля поради неуспешното изискване за изпълнение във файловия ресурс. Този трябва да свърши работа:

exec { 'test1':
   command => "/bin/true",                                             
   onlyif  => "test -f $passenger",                            
   path    => ['/usr/bin','/usr/sbin','/bin','/sbin'],
}

# Check if passenger file exists then push logrotate module for passenger
file { 'passenger':                                                  
    path    => '/var/tmp/puppet_test/logrotate.d/passenger',         
    owner   => 'root',
    group   => 'root',
    mode    => '0644',
    source  => "puppet://${puppetserver}/modules/web-logs/passenger.conf",
    require => Exec["test1"],
}

Ако бъдете обезпокоени от съобщението, че командата е изпълнена успешно при всяко изпълнение, можете да опитате да промените exec по този начин

exec { 'test1':
  command => "/bin/false",                                             
  unless  => "test -f $passenger",                            
  path    => ['/usr/bin','/usr/sbin','/bin','/sbin'],
}
person mat1010    schedule 23.07.2015

Премахнете exec test2. Не е необходимо. Трябва да require exec test1 в file passenger. Нещо като това :

class web-logs::passenger {
  file { 'passenger':                                                  
    path    => '/var/tmp/puppet_test/logrotate.d/passenger',         
    owner   => 'root',
    group   => 'root',
    mode    => '0644',
    source  => "puppet://${puppetserver}/modules/web-logs/passenger.conf",
    require => Exec["test1"],
 }
}
person iamauser    schedule 17.07.2015
comment
Но след това всяко изпълнение на единичен агент ще отчете exec като неуспешно и file като пропуснато. Това не е съвсем решение, а по-скоро шумно решение. - person Felix Frank; 19.07.2015
comment
Чудя се дали това не е най-добрият начин за проверка дали файлът съществува. Може би трябва да използвам фактори като променливи на средата, вместо да използвам exec? - person Ura718; 20.07.2015