Puppet中的validate_cmd:支持旧版本

时间:2014-11-21 22:46:49

标签: 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_cmd仅在Puppet中添加了> 3.5,我必须支持一些运行3.2及更早版本的系统。

是否有一些巧妙的方式将其修补到旧版本的Puppet中,或者我应该辞职使用puppetlabs-stdlib validate_cmd语句?

其中有类似的事情,但如果文件未正确验证,则不会还原该文件(对于文件中的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

1 个答案:

答案 0 :(得分:1)

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

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
}

当然,这将由puppetversion事实提供。

可以像这样使用覆盖语法File[<name>] { ... },因为实际资源声明没有为validate_cmd属性指定任何值。