Puppet 只需要从 exec 资源调用文件资源

puppet need to call file resource from exec resource only

是否只有在 unless 条件满足时才从 exec 资源调用 puppet file 资源?默认情况下 file 资源不应执行,它只能通过 exec 资源触发。

更新的详细信息:

这是我的清单文件

file { '/tmp/test_script.sh':
        path => '/tmp/test_script.sh',
        mode => 755,
        owner => 'root',
        group => 'root',
        ensure => file,
        source => "puppet:///modules/custom_files//tmp/test_script.sh",
}

exec {'run_script':
        unless => '/bin/rpm -qa | grep package-name',
        require => File['test_script.sh'],
        command => '/tmp/test_script.sh',
}

这里我希望 file { '/tmp/test_script.sh': 资源只有在 exec 资源的条件 unless => '/bin/rpm -qa | grep package-name', 不满足时才必须执行。否则不应执行此文件资源。

您展示的东西不可能像您想要的那样工作。因为 Exec 需要首先(有条件地)应用 File,所以它自己的 unless 参数不会及时评估以影响它,即使它有办法做到这一点。

一般来说,机器当前状态的详细信息必须通过 事实 传达给目录编译器,Puppet 将根据这些详细信息来决定机器目录的内容。 Puppet / Facter 没有传达您需要的信息的内置事实,但是添加代理将为您评估的 external fact or a custom fact 非常容易。

细节根据所涉及的软件版本略有不同,但如果您使用的是最新的 Puppet 和 Facter,那么我的建议将是一个外部事实。例如,您可以将此脚本放在相应模块的 facts.d/ 目录中:

#!/bin/bash

echo mypackage=$(/bin/rpm -q mypackage || echo none)

在您的清单中,您可以这样做:

if $mypackage == 'none' {
  file { '/tmp/test_script.sh':
    path   => '/tmp/test_script.sh',
    mode   => 755,
    owner  => 'root',
    group  => 'root',
    ensure => file,
    source => "puppet:///modules/custom_files//tmp/test_script.sh",
  }

  exec {'run_script':
    command => '/tmp/test_script.sh',
    require => File['test_script.sh'],
  }
}

请注意,事实是在应用任何资源之前进行评估的,因此如果您有其他可能管理相关 RPM 的清单,那么您需要与之协调。