【问题标题】:validate_cmd in Puppet: supporting older versionsPuppet 中的 validate_cmd:支持旧版本
【发布时间】: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


    【解决方案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 属性指定任何值。

    【讨论】:

    • 我以前从未见过这样使用覆盖语法,非常酷! :)
    猜你喜欢
    • 1970-01-01
    • 2013-10-29
    • 2014-06-15
    • 1970-01-01
    • 1970-01-01
    • 2020-12-19
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    相关资源
    最近更新 更多