3

Puppet の Exec タイプで非常に奇妙な動作が発生しています。

Exec[]以下に示すように、クラスには 2 つの類似したパラメーターがあり、どちらもonlyifパラメーターを使用しています。問題はExec['apt-update']常に実行されます (つまり、Puppet のエージェントがそのマニフェストを適用するたびに)、onlyif条件が falseの場合でも、Exec['install-newrelic-apt-key']正常に動作するのとは異なります。

注: myExec[]のパス ($PATH) はこのクラスの外部で構成され、すべてのコマンドはコマンド ラインで期待どおりに機能します

class newrelic::server($license_key) {
  file { "/etc/apt/sources.list.d/newrelic.list":
    ensure  => present,
    content => "deb http://apt.newrelic.com/debian/ newrelic non-free",
  }

  exec { "apt-update":
    command => "aptitude update",
    onlyif  => "test 0 -eq $(dpkg -l | grep -c newrelic-sysmond)",
    require => File['/etc/apt/sources.list.d/newrelic.list'],
  }

  exec { "install-newrelic-apt-key":
    command => "apt-key adv --keyserver hkp://subkeys.pgp.net --recv-keys 548C16BF",
    onlyif  => "test 0 -eq $(apt-key list | grep -c 548C16BF)",
  }

  package { "newrelic-sysmond": 
    ensure  => latest,
    require => [
        Exec["install-newrelic-apt-key"],
        Exec["apt-update"],
    ],
  }

  file { "/etc/newrelic/nrsysmond.cfg":
    ensure  => present,
    content  => template("newrelic/nrsysmond.erb"),
    owner   => "root",
    group   => "newrelic",
    mode    => "0640",
    notify  => Service["newrelic-sysmond"],
  }

  service { "newrelic-sysmond":
    ensure    => running,
    enable    => true,
    hasstatus => true,
    require   => Package["newrelic-sysmond"],
  }
}

※上記コードはパブリックドメインですので、ご自由にお使いください。

4

2 に答える 2

2

onlyifあなたのコマンドがあなたが期待しているシェル補間を受けるとは思いません。unless次のようにステートメントに切り替えてみます。

class newrelic::server($license_key) {
  file { "/etc/apt/sources.list.d/newrelic.list":
    ensure  => present,
    content => "deb http://apt.newrelic.com/debian/ newrelic non-free",
  }

  exec { "apt-update":
    command => "aptitude update",
    unless  => "dpkg -l | grep -c newrelic-sysmond",
    require => File['/etc/apt/sources.list.d/newrelic.list'],
  }

  exec { "install-newrelic-apt-key":
    command => "apt-key adv --keyserver hkp://subkeys.pgp.net --recv-keys 548C16BF",
    unless => "apt-key list | grep -c 548C16BF",
  }

  package { "newrelic-sysmond": 
    ensure  => latest,
    require => [
        Exec["install-newrelic-apt-key"],
        Exec["apt-update"],
    ],
  }

  file { "/etc/newrelic/nrsysmond.cfg":
    ensure  => present,
    content  => template("newrelic/nrsysmond.erb"),
    owner   => "root",
    group   => "newrelic",
    mode    => "0640",
    notify  => Service["newrelic-sysmond"],
  }
于 2013-06-07T17:46:58.253 に答える
1

実際、マニフェストはすべて正しいのですが、パペット エージェント プロセスを再起動した後、期待どおりに動作し始めました

私にとっては、Puppet のバグのように思えます。

于 2013-06-11T20:09:42.980 に答える