【问题标题】:Puppet test and remove an array of files/foldersPuppet 测试并删除一组文件/文件夹
【发布时间】:2015-12-08 18:55:38
【问题描述】:

我希望以某种方式使以下代码工作,似乎如果我不先测试文件/文件夹,我最终会遇到错误:

错误:无法应用目录:参数路径失败 File[/opt/dynatrace-6.2]:文件路径必须是全限定的,不是 '["/opt/dynatrace-6.2", "/opt/dynatrace-5.6.0", "/opt/rh/httpd24/root/etc/httpd/conf.d/dtload.conf", “/opt/rh/httpd24/root/etc/httpd/conf.d/01_dtagent.conf”]' 在 newrelic.pp:35

相关部分

$dtdeps = [
  "/opt/dynatrace-6.2",
  "/opt/dynatrace-5.6.0",
  "${httpd_root}/conf.d/dtload.conf",
  "${httpd_root}/conf.d/01_dtagent.conf",
]

exec { "check_presence":
  require => File[$dtdeps],
  command => '/bin/true',
  onlyif => "/usr/bin/test -e $dtdeps",
}

file { $dtdeps:
  require => Exec["check_presence"],
  path    => $dtdeps,
  ensure  => absent,
  recurse => true,
  purge   => true,
  force   => true,
} ## this is line 35 btw

exec { "stop_dt_agent":
  command => "PID=$(ps ax |grep dtwsagent |grep -v grep |awk '{print$1}') ; [ ! -z $PID ] && kill -9 $PID",
  provider => shell,
}

service { "httpd_restart" :
    ensure    => running,
    enable    => true,
    restart   => "/usr/sbin/apachectl configtest && /etc/init.d/httpd reload",
    subscribe => Package["httpd"],
}

【问题讨论】:

    标签: puppet dynatrace


    【解决方案1】:

    您的代码看起来基本正确,但您的 file 资源过度使用:

    file { $dtdeps:
      require => Exec["check_presence"],
      path    => $dtdeps,
      ...
    

    确实从您的数组中创建所有文件资源(因为您使用数组作为资源标题)但是其中的每一个然后将尝试使用与path 值相同的数组,这没有意义。

    TL;DR 删除 path 参数,它应该可以正常工作。

    【讨论】:

      【解决方案2】:

      您实际上可以简化很多。 Puppet 仅在文件不存在时运行文件删除,因此不需要 check_presence exec。

      你不能给路径一个数组,但你可以将标题作为一个数组传递,然后路径会自动生成。

      $dtdeps = [
        "/opt/dynatrace-6.2",
        "/opt/dynatrace-5.6.0",
        "${httpd_root}/conf.d/dtload.conf",
        "${httpd_root}/conf.d/01_dtagent.conf",
      ]
      
      file { $dtdeps:
        ensure  => absent,
        recurse => true,
        purge   => true,
        force   => true,
      }
      
      exec { "stop_dt_agent":
        command     => '[ ! -z $PID ] && kill -9 $PID',
        environment => ["PID=\$(ps ax |grep dtwsagent |grep -v grep |awk '{print$1}'))"],
        provider     => shell,
      }
      

      但是,运行 stop_dt_agent exec 有点脆弱。您可能可以将其重构为 service 资源:

        service { 'dynatrace':
          ensure   => stopped,
          provider => 'base',
          stop     => 'kill -TERM $(ps ax | grep \"dtwsagent\"|grep -v grep|awk '{print \$1}')',
          status   => "ps ax | grep "dtwsagent"",
        }
      

      【讨论】:

      • 这是因为存在竞争服务。 dt 部分加 1
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-19
      • 2014-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多