我有以下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
答案 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
属性指定任何值。