2014-11-21 151 views
1

我有以下木偶代碼:validate_cmd在木偶:支持舊版本

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只在僞滿添加> 3.5,我要支持運行3.2及以上的一些系統。

是否有一些巧妙的方法將猴子修補到老版本的Puppet中,或者我應該辭職使用puppetlabs-stdlibvalidate_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') 
} 

這有點繁瑣的木偶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

您的清單可以將其行爲調整爲代理版本。

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屬性指定值。

+0

我還沒有看到覆蓋以前使用過的語法,非常酷! :) – 2014-11-26 12:21:17