Puppet:仅在关闭时评估内部变量

Puppet: Evaluating variables inside onlyif close

我有一个在很早的阶段设置的变量,变量是布尔值,然后在某些时候我想exec一个基于事实的命令,如果这个变量是真还是假,一些东西像这样:

exec { 'update-to-latest-core': 
  command     => "do something",
  user        => 'root',
  refreshonly => true,
  path        => [ "/bin/bash", "sbin/" , "/usr/bin/", "/usr/sbin/" ], 
  onlyif      => 'test ${latest} =      true',
  notify      => Exec["update-to-latest-database"],
}

所以这个命令不起作用(onlyif => ['test ${latest} = true'],)我也尝试了其他几种方法,但没有起作用。这么简单的事情不可能这么难做。有人可以帮我解决这个问题,并解释一下让命令在 onlyif close 中执行背后的规则。 (我也不能在更高级别上使用 if-close 因为我有其他依赖项)

由于 $latest 是一个 Puppet 变量,因此在应用目录之前延迟检查其值是没有用的。实际上,从技术上讲,您不能这样做:Puppet 会将变量的值插入到 Exec 资源的目录表示中,因此在应用目录时没有留下任何变量,只有文字。

由于有问题的资源是由另一个资源通知的,您不能完全压制它。如果您的问题中提供的代码不起作用,则可能是因为 $latest 的内插值与您预期的不同——例如,“1”而不是 'true'。 运行 --debug 模式下的代理应该会向您显示正在执行的命令的详细信息。

或者,您可以采用不同的方法:

exec { 'update-to-latest-core': 
  command     => $latest ? { true => "do something", default => '/bin/true' },
  user        => 'root',
  refreshonly => true,
  path        => [ "/bin/bash", "sbin/" , "/usr/bin/", "/usr/sbin/" ], 
  notify      => Exec["update-to-latest-database"],
}

每当 $latestfalse 时,它将执行(成功,并且没有外部影响),并且每当 $latest 时,它将 运行 您的 do something 命令] 是 true。命令的选择是在目录构建过程中做出的。