我怎么能干这个木偶课呢?

时间:2012-01-31 20:19:04

标签: dry puppet

我有这个代码,根据节点是否是Debian机器执行稍微不同的操作:

class nginx::package {

  case $operatingsystem {
    'debian': {
      apt::preference { 'nginx':
        package => 'nginx nginx-common',
        priority => '600',
        release => 'a=squeeze-backports',
      }

      package { 'nginx':
        ensure => present,
        require => Apt::Preference['nginx'],
      }
    }
    default: {
      package { 'nginx':
        ensure => present,
      }
    }
  }

}

似乎应该有办法减少重复,但对我来说没有什么明显的。思考?

2 个答案:

答案 0 :(得分:1)

你的意思是你如何列出两次包裹?基本答案是,关系一端的require与关系另一端的before相同。这允许您将关系规范移动到必须在条件内的项目:

class nginx::package {
  case $operatingsystem {
    'debian': {
      apt::preference { 'nginx':
        package => 'nginx nginx-common',
        priority => '600',
        release => 'a=squeeze-backports',
        before => Package['nginx'];
      }
    }
    default: {} # nothing
  }
  package { 'nginx':
    ensure => present,
  }
}

阅读puppet metaparameter docs了解详情。

使用较新版本的puppet的另一种方法是使用chaining,如:

class nginx::package {
  case $operatingsystem {
    'debian': {
      apt::preference { 'nginx': ...}
      Apt::Preference['nginx'] -> Package['nginx']
    }
    default: {}
  }
  package { 'nginx': ... }
}

最后,有一个Package['nginx'] { require => Apt::Preference['nginx'] }语法可以调用以向Package添加一个需求,但我相信这需要你在一个继承的类中执行它会使你的例子中的事情变得更复杂可用的资源链对于除/之前/之后/订阅/通知资源更改之外的其他事情更有用。

class nginx::package::aptpreference inherits nginx::package {
  Package['nginx'] { require => Apt::Preference['nginx'] }
}
class nginx::package {
  case $operatingsystem {
    'debian': {
      apt::preference { 'nginx': ...}
      include nginx::package::aptpreference
    }
    default: {}
  }
  package {...}
}

答案 1 :(得分:0)

您可以使用选择器。

我将保持apt :: preference部分不变,因为我讨厌if语句并且我喜欢它们的case语句。但是要删除正在处理的包

将包移到外面并使用选择器来处理需求订单。

package { foo:
  ensure => present,
  require => $::operatingsystem ? { 
    default => undef,
    debian => Apt::Preference[foo],
  },
}