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
属性指定任何值。我以前没有见过像这样使用覆盖语法,非常酷!)