1

我正在尝试编写一个 puppet 脚本,它将通过 un-tar 安装一个模块。如果 puppet 已经解压,我希望 puppet 失败。我尝试执行以下代码,但即使目录不存在,它也总是失败。

我正在检查 /opt/sk 是否存在然后失败,否则继续安装。

define splunk::fail($target)
{
    $no = 'true'
    case $no {
         default : { notice($no) }#fail('sk is already installed.')}
    }
}

define splunk::forwarder( $filename , $target )
{
    file{"$target/sk":
        ensure => present
    }

    splunk::fail{"NO":
        target => '/opt/',
        require => File[$target],
    }

    file{"$target/A.tgz":
        source => $filename ,
        replace => false ,
    }

    exec{"NO1":
        command => "tar xzvf A.tgz" ,
        cwd => $target ,
        require => File["$target/A.tgz"] ,
    }

    exec{"Clean":
        command => "rm -rf A.tgz" ,
        cwd => target ,
        require => Exec["NO1"],
    }
}

splunk::forwarder {"non":
    filename => 'puppet:///modules/splunk/files/NO.tgz' ,
    target => '/opt/',
}

谢谢

4

2 回答 2

2

定义custom_fact并将其与失败资源结合使用。

在您的 ruby​​ 目录中,例如/usr/lib/ruby/vendor_ruby/facter定义tmp_exist.rb包含内容的文件:

# tmp_exist.rb

Facter.add('tmp_exist') do
  setcode do
     File.exist? '/root/tmp'
  end
end

接下来在 puppet manifest 中使用它。例如,我将它与stdlib 中的str2bool函数结合起来:

class test {

  if !str2bool($::tmp_exist) {
    fail('TMP NOT EXIST')
  }

  if !str2bool($::foo_exist) {
    fail('FOO NOT EXIST')
  }
}

include test

/root仅创建tmp文件中。

结果,您将拥有:

错误:FOO NOT EXIST at /etc/puppet/deploy/tests/test.pp:8 on node dbmaster

更新:我更新了我的答案。Chris Pitman 是对的,我之前的解决方案仅适用于 puppet master 或 puppet apply。我还找到了一篇文章,描述了如何在 puppet中定义自定义函数file_exists 。这也可能会有所帮助。

于 2015-07-20T12:57:07.047 回答
0

您应该使用 exec 的“creates”属性,例如:

exec { 'install':
  command => "tar zxf ${package}",
  cwd     => $some_location,
  path    => $path,
  creates => "${some_location}/my_package",
}

如果“${some_location}/my_package”不存在,Puppet 只会执行“安装”。

于 2015-07-23T13:39:52.087 回答