【问题标题】:puppet: if one file exists then copy another file overpuppet:如果一个文件存在,则复制另一个文件
【发布时间】:2015-07-16 20:02:51
【问题描述】:

我正在尝试弄清楚如何使我的 puppet 模块工作,因此我需要测试客户端上是否存在文件,如果存在,则复制另一个文件。如果文件不存在,则什么也不做。我似乎无法让它工作。这是我的模块:

类 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",
  }
}

任何帮助将不胜感激!

【问题讨论】:

  • 一个干净的解决方案将涉及一个自定义事实。但我真的很好奇这个要求是如何产生的。不管以前的状态如何,让 Puppet 创建文件会简单得多。

标签: file copy exec puppet


【解决方案1】:

执行失败,因为您缺少要执行的命令。现在一切都失败了,因为文件资源中的 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'],
}

【讨论】:

    【解决方案2】:

    删除exec test2。这是没有必要的。您需要在file passengerrequire exec test1。像这样:

    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"],
     }
    }
    

    【讨论】:

    • 但是每个单独的代理运行都会报告exec 失败,file 被跳过。这不是一个完全的解决方案,更像是一个嘈杂的解决方法。
    • 我想知道这是否不是检查文件是否存在的最佳方法。也许我需要使用因子作为环境变量而不是使用 exec?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-22
    • 2013-08-10
    • 2015-02-04
    • 1970-01-01
    • 1970-01-01
    • 2016-06-18
    相关资源
    最近更新 更多