2017-12-05 32 views
1

のは、次のように私は私のNixOS configuration.nixを設定しているとしましょう:NixOS - 引数を持つモジュールの輸入

{config, pkgs, ...}: 
{ 
    services.openssh.enable = true; 
} 

私は今、引数に基づいて、私のホスト名を設定しますnetworking.nixと呼ばれる第二のファイルを持っていると思います。

{config, pkgs, hostname, ...}: 
{ 
    networking.hostName = hostname 
} 

これは可能ですか?どのようにファイルを含めることができます。私はすでにimports = [ ./networking.nix { hostname = "helloworld"; } ];を使ってやってみましたが、うまくいきませんでした。

ありがとうございました。

答えて

3

「NixOS設定ファイル」は、単にオプションを定義しないモジュールなので、区別がありません。 configuration.nixファイルは単なるモジュールであり、通常はオプションを定義しないので、abbreviated formに書き込むことができます。

オプションを定義することは、NixOSモジュールが情報を渡すための通常の方法です。そのため、これは最も慣用的な方法です。

しかし、本当に特別な理由から、NixOSで非常に珍しいことをしているので、任意の機能をimportsに入れることができます。しかし、モジュールシステムのカスタムエラーメッセージや、モジュールがどこに定義されているかを知ることに依存する可能性のある他の側面ではうまく動作しないため、そうしてはいけません。その場合は、それが実際の機能であることを確認してください。

hostname: {config, pkgs, ...}: 

ない私の意見では、非常にきれい:あなたのケースでは、それはそれカリー化関数にするnetworking.nixの最初の行を変更暗示します。何が起こっているかは非常に明白ですが、NixOSモジュールに期待されるものから逸脱しています。

+0

NixOSで珍しいことをやっているのかどうか分かりません。私の目標は、一連のVMを共通の構成で共有することでした。ホスト名やIPアドレスのように、これらのVMの一部のパラメータだけを変更する必要があります。私は、これらの共通サービスの設定をパラメータとともにインポートするのが当然の選択だと考えました。より良いアプローチがありますか?それとも私が完全に間違った後の哲学ですか?申し訳ありませんが、私はNixOSに関しては初心者です。 :( – lschuermann

+0

NixOSモジュールのオプションを使用して2. Nix関数としてパラメータ化されたモジュールを経由して、設定の一部に値を注入する3つの方法を使用することができます。 ; 3.特別な '_module.args'オプションを使用するモジュールオプションはNixOSのどこでも使用されているので、まずそれを試してください。おそらく十分で、タイプチェックとカスタムNixOSマニュアルを無料で入手できます。私があなたのコードを判断するためにここにいるわけではありません;) –

+0

'hostname:{...}:'解決策は、モジュールシステムの周りで動作するため、可能な場合は避けてください。モジュールシステムを操作すると、エラーメッセージに適切な場所がないことや、サードパーティのモジュールからそれらを削除できないなどの問題が発生します。あなたの情報については、この形式は従来の理由とNixOSテストスイートで使用されているという事実のために存在します。 – nbp

3

_module.argsオプション[1]を使用することができます。値は非常に単純ですどこしかし、おそらく、例えば、それらを直接設定することがはるかに容易になります

{config, pkgs, ...}: 
{ 
    _module.args.hostname = "ahostname"; 
    services.openssh.enable = true; 
} 

:だからあなたのconfiguration.nixは次のようになりますnetworking.hostnameconfiguration.nixに定義してください。マニュアルのこのセクション。合併や優先順位も参考になるかもしれません[2]


さらなる議論:値のみよう...が表すpkgs値として直接それを参照モジュールに使用されるものの

_module.argsの値は、実際にインポートされたすべての構成(に適用されます参照されていないすべての値)。

モジュールに引数を渡すのは良いアプローチだと思われますが、あなたのコメントからはおそらく別のアプローチが適しているかもしれません。

別の解決策は、複数の異なる構成を代用する単一の共通構成ではなく、複数の異なる構成をインポートする代わりに、インポートで関係を反転することです。例えば。

NixOSの設定this Redditのコメントは、このアプローチを使用しているようです。人々が公にオンラインで共有している他のいくつかのNixOS設定がありますので、そこにいくつかの便利なアイデアがあるかもしれません。ロバートヘンシングの答えのポイントは、心に留めておくのにも非常に便利です。

しかし、あなたがそれを使用したいコンテキストについてもう少し詳しく知ることなく、あなたの場合にはもっと良い解決策があるとは言い難いです。より適切な解決策を見やすくするための情報を追加して、新しいSO質問を作成することができます。

+0

あなたのソリューションは間違いなく働いていますが、私にとっては正しいアプローチではないようです。これで、インポートによってインポートされたすべてのファイルの引数を定義します。 私の目標は、Robertの答えで書かれているように、VMのセットにいくつかの共通の設定ファイルを共有させ、共有してはいけないいくつかのパラメータだけを変更することです。これを達成する最も慣用的な方法は何でしょうか? – lschuermann

+0

私は私の答えにいくつかの議論を追加しました。うまくいけば、それはあなたが取り組んでいる特定のコンテキストのためにもう少し便利です。 – brocking

関連する問題