1

我有这段代码,根据节点是否是 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,
      }
    }
  }

}

似乎应该有一种方法来减少重复,但对我来说没有什么明显的。想法?

4

2 回答 2

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 元参数文档以获取更多信息。

较新版本的 puppet 的另一种选择是使用如下链接

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

最后,Package['nginx'] { require => Apt::Preference['nginx'] }您可以调用一种语法来向包中添加要求,但我相信这要求您在继承的类中执行此操作,这会使您的示例中的事情变得更加复杂,而且现在有可用的资源链接更有用对于之前/之后/订阅/通知资源更改以外的事情。

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 {...}
}
于 2012-02-01T18:08:37.303 回答
0

您可以为此使用选择器。

我将保留 apt::preference 部分不变,因为我讨厌 if 语句,我喜欢用 case 语句代替它们。但是删除正在处理的包裹

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

package { foo:
  ensure => present,
  require => $::operatingsystem ? { 
    default => undef,
    debian => Apt::Preference[foo],
  },
}
于 2012-03-21T01:26:15.630 回答