Puppet中的validate_cmd:支持旧版本

Puppet中的validate_cmd:支持旧版本,puppet,Puppet,我有以下傀儡代码: file { "/etc/sudoers.d/${name}": content => template('sudo/sudoers.erb'), owner => 'root', group => 'root' mode => '0440', validate_cmd => '/usr/sbin/visudo -c -f %', } 然而,validate\

我有以下傀儡代码:

file { "/etc/sudoers.d/${name}":
   content      => template('sudo/sudoers.erb'),
   owner        => 'root',
   group        => 'root'
   mode         => '0440',
   validate_cmd => '/usr/sbin/visudo -c -f %',
 }
然而,
validate\u cmd
只是在Puppet>3.5中添加的,我必须支持一些运行3.2及更旧版本的系统

有没有什么聪明的方法可以把它移植到旧版本的Puppet中,或者我应该放弃使用
puppetlabs stdlib
validate\u cmd
语句

它会执行类似的操作,但如果文件没有正确验证,则不会恢复该文件(fle上的validate_cmd参数的主要优点)

编辑:使用Felix的覆盖语法,我得到了以下代码:

file { "/etc/sudoers.d/${name}":
  content      => template('sudo/sudoers.erb'),
  owner        => 'root',
  group        => 'root',
  mode         => '0440',
}
if versioncmp($::puppetversion, '3.5') >= 0 {
  File["/etc/sudoers.d/${name}"] { validate_cmd => '/usr/sbin/visudo -c -f %' }
}
else {
  validate_cmd(template('sudo/sudoers.erb'), '/usr/sbin/visudo -c -f', 'Visudo failed to validate sudoers content')
}
在puppet rspec中进行测试有点麻烦,我最终采用了以下方法:

if (Puppet.version >= '3.5.0')
  context "validating content with puppet #{Puppet.version}" do
    let(:params) { { :users => ['joe'] } }
    let(:facts) {{ :puppetversion => Puppet.version }}

    it { should contain_file('/etc/sudoers.d/worlddomination').with_validate_cmd('/usr/sbin/visudo -c -f %') }
  end
else
  context "validating content with puppet #{Puppet.version}" do
    let(:params) { { :users => ['joe'] } }
    let(:facts) {{ :puppetversion => Puppet.version }}

    it { should contain_file('/etc/sudoers.d/worlddomination').with_validate_cmd(nil) }
  end
end

您的清单可以根据代理版本调整其行为

file { "/etc/sudoers.d/${name}":
  content      => template('sudo/sudoers.erb'),
  owner        => 'root',
  group        => 'root'
  mode         => '0440',
}

if versioncmp($puppetversion, '3.5') >= 0 {
  File["/etc/sudoers.d/${name}"] { validate_cmd => '/usr/sbin/visudo -c -f %' }
}
else {
  # your workaround here
}
当然,这将得益于
木偶版本
事实


覆盖语法
File[]{…}
可以这样使用,因为实际的资源声明没有为
validate\u cmd
属性指定任何值。

我以前没有见过像这样使用覆盖语法,非常酷!)