2

Foreman enc で Puppet(v3.6.2) を使用しており、次の図のモジュールに示されているパターンのカスタム モジュールが多数あります。

#mkdir/manifests/init.pp
class mkdir ($path, $mode) {
  class {'mkdir::file': }
}

#mkdir/manifests/file.pp
class mkdir::file {
  file {$mkdir::path:
    ensure => 'directory',
    mode   => $mkdir::mode,
  }
}

#mkdir/spec/classes/mkdir_spec.rb
require 'spec_helper'
describe 'mkdir' do
  let(:params) {{ :path=>'/foo', :mode=>'777' }}
  it { should contain_class( 'mkdir::file' ) }
end

# All good so far, but here's the rub
# mkdir/spec/classes/file_spec.rb
require 'spec_helper'
describe 'mkdir::file' do
  # how can I set $mkdir::path and $mkdir::mode???
  let(:params) {{ :path=>'/bar', :mode=>'555' }}

  it { should contain_file('/bar').with({
    mode=>'555' })
  }
end

コードのコメントにあるように、file_spec テスト内でモジュール パラメータ $mkdir::path と $mkdir::mode をどのように設定しますか?

明らかに、モジュールをリファクタリングして、必要なすべてのパラメーターを各サブクラスに渡すことができます。それが唯一の方法である場合はそうしますが、このパターンをそのままテストする方法がないようです。

また、module::params パターンを使用した多くの例を見てきました。これは確かに hiera を使用したインストールのクリーンなパターンですが、そのパターンを Foreman で機能させることはできませんでした。せいぜい 2 つを含める必要があります。醜いパラメータ化されたモジュールごとのパペットクラス。

4

2 に答える 2

3

あなたの結論はほぼ正しいです。ただし、paramsクラス パターンは、ノード レベル構成のスキームとは無関係です。Hiera をより緊密に結びつけることも可能かもしれませんが、通常は次のようにします。

  1. クラスでデフォルト値を定義しますparams。デフォルトは、 などの Fact 値に依存する場合があります$osfamily
  2. モジュールのメイン クラスinheritをクラスparamsにし、で宣言された変数paramsをモジュール クラス パラメータのデフォルト値として使用します。
  3. paramsENC を使用する場合は、必要に応じてクラスのデフォルトを上書きするために、ノード変数データをパラメーター値としてモジュールに渡すようにしてください。
  4. モジュール クラスがそれぞれ必要なすべての構成データをモジュール内の各クラスに転送するようにします。

例えば:

class mkdir::params {
    case $osfamily {
        'Debian': { $path = '/usr/share/foo' }
        'RedHat': { $path = '/var/lib/foo' }
        default:  { fail "The $osfamily platform is not supported by the mkdir module." }
    }
    $mode = 644
}

class mkdir($mode = $mkdir::params::mode,
            $path = $mkdir::params::path) inherits mkdir::params
{
    class { 'mkdir::file': mode => $mode, path => $path }
}

class mkdir::file($path, $mode) {
    # ...
}

その場合、テストの作成は非常に簡単です。

于 2014-11-26T11:38:25.783 に答える