web-dev-qa-db-ja.com

Puppetが各パッケージを一度だけ要求できるのはなぜですか?

クラスで依存関係を定義するとき、各Packageは一度だけグローバルに定義できます。構成の階層があり、一部のパッケージはすべてのマシンにインストールする必要があります(デフォルト構成になります)が、他のパッケージは特定のカテゴリーのマシンにのみインストールする必要があります。 Puppetの脅威が重複宣言である場合、そのパッケージがすでにマシン上にあるかどうかを確認するにはどうすればよいですか?

  Duplicate declaration: Package[wget] is already declared 

このような関数を使用する必要がありますか?

  if defined( Package[$package] ) {
    debug("$package already installed")
  } else {
    package { $package: ensure => $ensure }
  }

私は設定ツールがこの問題をデフォルトで処理することを期待します...私は何かが足りないのですか?

6
Tombart

stdlibモジュール からensure_resource()を使用できます:

$packages = $::osfamily ? {
    'Debian' => [ 'fcgiwrap', ],
    'RedHat' => [ 'spawn-fcgi', 'git' ],
}
ensure_resource('package', $packages, {'ensure' => 'present'})

したがって、たとえば、gitが他のクラスによってすでにインストールされている場合、それはスキップされます。パペット構成全体でパッケージを1回だけ定義する必要はありません。

7
synapse

重複するパッケージがある場合、それはそれに対処する1つの方法です。もう1つの方法は、仮想リソースを使用して、そもそも問題を回避することです。

仮想リソースの宣言

class packages {
  @package {
    ['cryptsetup-bin',
     'cryptsetup',
     'cifs-utils',
     'e2fsprogs',
     'libmysql-Ruby',
     'parted',
     'pigz',
      'sshfs' ]:
        ensure => present,
    }
}

仮想リソースの実現(リソースは複数回実現できます):

include packages
realize Package['pigz']

別のアプローチは、複製されたコードを別のクラス、つまり「wget」クラスに分離することです。

Puppet Doc: http://docs.puppetlabs.com/guides/virtual_resources.html

4
Craig Watson