如何使用Puppet exec的返回值?

如何使用Puppet exec的返回值?,puppet,Puppet,我如何使下面的逻辑工作?我的目标是比较custom fact$environment的值和文件/etc/facter/facts.d/oldvalue的内容 如果自定义fact$环境不等于文件/etc/facter/facts.d/oldvalue的内容,则执行以下代码 exec {'catenvchange' : command => "/bin/cat /root/oldvalue"} if $environment != exec['catenvchange'] {#code

我如何使下面的逻辑工作?我的目标是比较custom fact$environment的值和文件/etc/facter/facts.d/oldvalue的内容

如果自定义fact$环境不等于文件/etc/facter/facts.d/oldvalue的内容,则执行以下代码

exec {'catenvchange' :
   command => "/bin/cat /root/oldvalue"}

if $environment != exec['catenvchange'] {#code#}

Exec
资源不是这样工作的。事实上,没有任何资源是以这种方式工作的,也没有任何远程方式。此外,目录
/etc/facter/facts.d/
有一个特殊的用途,您对如何在中使用文件的期望与该用途不一致

你所描述的想要做的事情看起来模糊地像是建立一个外部事实并测试它的价值。如果您通过某种方式(手动、插件同步、
文件
资源等)删除名为
/etc/facter/facts.d/anything
)的可执行脚本,则该脚本将在每个傀儡运行之前执行,作为收集节点事实过程的一部分。脚本生成的标准输出将被解析为
key=value
对,每个对定义一个事实名称及其值。这样指定的事实,例如名为“last_environment”的事实,将在目录构建期间可用。然后您可以这样使用它:

if $::environment != $::last_environment {
    # ...
}
更新:

使用此机制来记忆给定事实(例如,
$::environment
)在一次运行时具有的值,以便在下一次运行时可以将其读回的一种方法是声明一个管理外部事实脚本的
文件
资源。比如说,

file { '/etc/facter/facts.d/oldvalues':
  ensure  => 'file',
  owner   => 'root',
  group   => 'root',
  mode    => '0755',
  content => "#!/bin/bash\necho 'last_environment=${::environment}'\n"
}

我更改了文件位置。基本上,当我试图跟踪对事实的更改时,我希望将/etc/facter/facts.d/facts.yaml的内容存储到文件/root/oldvalue中。由于事实在执行模块之前先运行,因此需要运行两次puppet才能正确设置事实并根据更改的事实执行我的代码。从目标节点收集的信息只能以事实的形式提供给目录生成器。但是,如果目标节点同时也是运行目录生成器的机器(即,对于
puppet apply
),则可以使用
generate()
函数在目录生成器机器上运行命令并收集其输出。但是,在任何情况下,在构建包含该资源的目录的过程中应用该资源都不会产生任何结果/bin/bash oldvalue=“
cat/etc/facter/facts.d/facts.yaml | grep环境| awk'{print$2}'
”;printf$oldvalue;我仍然无法使用事实$::oldvalue。在puppet运行期间,它作为事实文件/etc/facter/facts.d/oldvalue被解析,但返回了一个空数据集
facter--version
告诉您什么?facter--version 2.4.1