2017-12-05 25 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이 공통 구성을 공유하도록하는 것이 었습니다. 이러한 VM의 일부 매개 변수 만 변경해야합니다 (예 : 호스트 이름 또는 IP 주소). 매개 변수가있는 이러한 공통 서비스의 구성을 가져 오는 것이 자연스러운 선택이라고 생각했습니다. 더 나은 접근 방법이 있습니까? 아니면 내가 완전히 틀린 철학인가? 죄송합니다. 저는 NixOS에 관해서는 완전히 초보자입니다. : – lschuermann

+0

NixOS 모듈 옵션을 통해 2. Nix 함수로 매개 변수화 된 모듈을 통해 2. 구성 요소에 값을 주입하는 세 가지 방법을 사용할 수 있습니다. ; 3. 특수한'_module.args' 옵션을 통해 모듈 옵션은 NixOS의 모든 곳에서 사용되기 때문에 먼저 시도해야한다. 아마도 충분할 것이고 타입 검사와 커스텀 NixOS 매뉴얼을 무료로 얻을 수있을 것이다. VM 이미지에 의존하는 패키지를 작성했을 때 매개 변수화 된 모듈'module.args'는 아마도 잘못된 도구 일 것입니다. 당신의 코드를 판단하기 위해 여기에 온 것이 아닙니다;) –

+0

'hostname : {...} :'해결책은 모듈 시스템에서 작동하기 때문에 가능하면 피하십시오. 모듈 시스템을 사용하면 오류 메시지에 적절한 위치가 없거나 타사 모듈에서 모듈을 제거 할 수없는 등의 문제가 발생할 수 있습니다. 참고로,이 형식은 기존의 이유와 그것이 NixOS 테스트 스위트에 사용된다는 사실 때문에 여전히 존재합니다. – nbp

3

_module.args 옵션 [1]을 사용해야합니다. 값이이 아마 직접, 예를 들어, 그들을 설정하는 것이 훨씬 쉬울 것이다 매우 간단하지만 어디

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

: 그래서 당신의 configuration.nix은 같은 것 networking.hostnameconfiguration.nix에 정의하십시오. 매뉴얼 섹션. 병합 및 우선 순위도 도움이 될 수 있습니다 [2].


또한 토론 :

_module.args의 값은 실제로 ...를 나타내는 직접 예 pkgs 값으로서,이를 참조 값 전용 모듈에 사용된다하더라도 모두 가져온 구성 (에인가 참조되지 않은 모든 값).

모듈에 인수를 전달하는 것은 나에게 좋은 접근 방법 인 것처럼 보이지만, 아마도 여러분의 의견에서 다른 접근 방식이 더 적합 할 수 있습니다.

다른 솔루션은 가져 오기에서 관계를 뒤집을 수 있습니다. 여러 개의 다른 구성 대신 여러 개의 다른 인수를 전달하는 단일 공통 구성보다는 일반적인 구성을 가져옵니다. 예 : 그것은이 방법을 사용하여 같은

$cat ./common.nix 
{ services.openssh.enable = true; } 
$cat ./ahostname.nix 
{ imports = [ ./common.nix ]; networking.hostname = "ahostname"; } 

this 레딧 주석의 NixOS의 설정 보인다.사람들이 공개적으로 온라인으로 공유 한 다른 몇 가지 NixOS 구성이 있으므로 유용한 아이디어를 찾을 수 있습니다. 로버트 헨징 (Robert Hensing)의 대답에 대한 요점은 마음에 곰곰이 생각해 볼 때 매우 유용합니다.

그러나 사용하고자하는 상황에 대해 조금 더 알지 못하면 무엇이 더 나은 해결책이 될지 말할 수 없습니다. 더 적절한 해결책을 더 쉽게 볼 수있는 정보가있는 새로운 SO 질문을 만들 수 있습니다.

+0

당신의 솔루션은, 확실히 일하는 동안, 나를 위해 올바른 접근 방식으로 보이지 않습니다. 이를 통해 수입을 통해 가져온 모든 파일에 대한 인수를 정의합니다. 맞습니까? 내 목표는 로버트의 대답에 따라 VM 집합에 몇 가지 공통 구성 파일을 공유하고 공유하지 말아야 할 몇 가지 매개 변수 만 변경하는 것입니다. 이것을 달성하는 가장 관용적 인 방법은 무엇입니까? – lschuermann

+0

나는 내 대답에 몇 가지 추가 토론을 추가했습니다. 희망하는 것은 당신이 작업하고있는 특정 상황에 좀 더 유용 할 것입니다. – brocking