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

时间:2016-08-01 06:47:06

标签: puppet

是否只有在满足file条件时才从exec资源调用puppet unless资源?默认值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',
}

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

1 个答案:

答案 0 :(得分:1)

你所呈现的东西没有机会像你想要的那样工作。由于Exec要求首先应用File(有条件地),因此不会及时评估其自己的unless参数以影响该参数,即使它有办法可以做到。

一般而言,必须通过事实将Puppet基于该机器目录内容决策的机器当前状态的详细信息传达给目录编译器。 Puppet / Facter没有内置的事实传达您需要的信息,但添加代理将为您评估的external factcustom 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,那么您将需要与之协调。