問題タブ [rspec-puppet]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
291 参照

puppet - puppet-rspec - 単体テスト中にネストされたプロファイル クラスにパラメーターを渡す方法は?

Hashicorp Consul DCS 用に 2 つの Puppet プロファイルを作成しようとしています。Consul はクライアントまたはサーバー エージェントとして実行できます。サーバー モードはクライアント モードのスーパーセットです。これは構成に直接反映されます。

通常、Consul サーバー エージェントには、Consul クライアント エージェントが必要とする構成のスーパーセットが必要です。

私の Puppet 設計アプローチは、次のパターンに基づいています: https://puppet.com/docs/pe/2018.1/the_roles_and_profiles_method.html

Puppet のドキュメントによると、コードの重複を避けるためconsul_clientに、プロファイルにプロファイルを含めることが可能である (そしておそらく望ましい) はずです。consul_server

プロファイルには、他のプロファイルを含めることができます。

これを実装しようとして、両方のプロファイルでいくつかの必須パラメーターを使用しましたが、自動 rspec 単体テストの実行中に問題が発生しました。

consul_client単体テスト ファイルではconsul_client_spec.rb、必要なパラメーターを次のように指定しました。

consul_server_spec.rb単体テストを実行しようとしたときに問題が発生しました。consul_server単純に、プロファイルの追加の必須パラメーターを 1 つ渡しただけです。

consul_clientプロファイルはプロファイルによってinclude編集/require編集されるため、プロファイル クラスconsul_serverのパラメーターが欠落してテストが失敗しました。consul_clientこれは、このアプローチの一般的な構造上の問題を示しているようです。


consul_clientここで、プロファイル クラス内のプロファイル クラスのすべてのパラメーターを再宣言する必要があるかどうかはわかりません。consul_serverこれは、私の意見では、DRY 原則に違反します。また、将来 Hiera データを使用する場合、データのクライアント関連部分を両方のプロファイルで繰り返す必要があるため、同じ重複データが含まれる状況が発生profile::consul_client::*します。profile::consul_server::*

追加された注:consul_serverまた、パラメーターを明示的に渡すことはできず、データを介してのみインクルードのようなリソース定義に渡すことができるため、クラス内のパラメーターの複製はおそらく機能しません。そのため、これらの複製されたパラメーターはconsul_clientクラスに渡すことができませんでした。

それどころか、ドキュメントには次のように記載されていますが、これが含まれているプロファイル クラスにも適用されるかどうかはわかりません (コンポーネント クラスではない可能性があるため?)。

プロファイルは、コンポーネント クラスのすべてのクラス パラメータを所有しています。プロファイルで 1 つが省略されている場合、それは間違いなくデフォルト値が必要であることを意味します。コンポーネント クラスは、Hiera データの値を使用しないでください。以前に省略されたクラス パラメータを設定する必要がある場合は、プロファイルをリファクタリングします。


これらの考えに加えて、2 つのプロファイル クラスが別のモジュールの通常のクラスにリファクタリングされていることもわかります。これは、異なる設計アプローチの意味を理解するのに役立つ場合があります。


結論として、次の疑問が生じます。

  • ネストされたプロファイルのパラメーターはどのように処理する必要がありますか? プロファイル クラスごとに個別に hiera データによって排他的に設定する必要がありますか?
  • 単体テスト中にネストされたプロファイルにパラメーターを渡す方法は? テストフィクスチャの一部としてモックhieraデータを提供するのは正しい方法でしょうか?
  • プロファイルクラスのモックはconsul_clientより良い選択肢でしょうか?