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

Я пытаюсь понять, как заставить мой кукольный модуль работать так, что мне нужно проверить, существует ли файл на клиенте, если он существует, то скопируйте другой файл. Если файл не существует, ничего не делайте. Кажется, я не могу заставить его работать. Вот мой модуль:

класс веб-журналы::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 терпит неудачу, так как вам не хватает команды для выполнения. Прямо сейчас все терпит неудачу из-за неудачного требования exec в файловом ресурсе. Это должно сделать трюк:

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
Интересно, не лучший ли это способ проверить, существует ли файл. Может быть, мне нужно использовать Facters в качестве переменных среды вместо использования exec? - person Ura718; 20.07.2015