問題タブ [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.
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
より良い選択肢でしょうか?