【发布时间】:2014-11-21 22:46:49
【问题描述】:
我有以下 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
【问题讨论】:
标签: puppet