除非Exec,否则Puppet文件资源会运行

时间:2017-10-12 02:37:45

标签: puppet

我应用本地清单来测试execfile资源:

class test_file {   
  exec { "touch /tmp/testfile":
    path   => ["/bin", "/usr/bin", "/sbin", "/usr/sbin"],
    unless => "test -d /tmp 2>/dev/null",
  }

  file { "/tmp/success":
    mode    => "0777",
    owner   => "root",
    group   => "staff",
    source  => "file:///Users/Shared/success",
    require => Exec["touch /tmp/testfile"],
  }
}

我期待发生的事情: exec运行并退出,因为unless语句返回0,因此文件资源永远不会运行,并且/tmp中都没有创建文件。

实际发生的事情: file资源始终运行,并复制"成功"归档到/tmp

我已经在macOS 10.11和10.12上使用puppet agent 4.10和5.3.2运行了这个结果。我只是试图运行一个条件,表示如果某个命令退出成功,则不会复制文件。任何见解或方向将不胜感激。

1 个答案:

答案 0 :(得分:1)

你误解了Puppet是如何运作的。

require元参数声明应该应用资源的顺序。*鉴于您的清单,Puppet只承诺Exec资源 - 如果它应用于所有 - 将永远是在文件资源之前应用。

还有另一个元参数subscribe。如果资源订阅到另一个资源,那么Puppet会尝试刷新"该资源,如果它订阅的资源改变状态。

不幸的是,你不能在这里使用它,因为文件资源会忽略"刷新事件"。

你可以做的,虽然它有点难看,但是:

class test_file () {
  Exec {
    path => ["/bin", "/usr/bin", "/sbin", "/usr/sbin"],
  }

  exec { "touch /tmp/testfile":
    unless  => "test -d /tmp 2>/dev/null",
  }

  exec { "cp /Users/Shared/success /tmp/success":
    subscribe   => Exec["touch /tmp/testfile"],
    refreshonly => true,
  }
}

*如果第一个资源无法应用,则require元参数也会阻止第二个资源被应用。请参阅文档中的failed dependencies部分。