我正在学习如何使用Nix / NixOs / NixOps,而我在重构简单的NixOps部署时遇到了麻烦。
我的出发点是这个工作vbox-all.nix
文件:
{
server =
{ config, pkgs, ... }:
{
# deployment-specific config
deployment.targetEnv = "virtualbox";
deployment.virtualbox.memorySize = 1024; # megabytes
deployment.virtualbox.vcpu = 2; # number of cpus
# postgres-specific config
services.postgresql.enable = true;
services.postgresql.package = pkgs.postgresql96;
# htop-specific config
environment.systemPackages =
[
pkgs.htop
];
};
}
运行nixops create ./vbox.nix -d mydeployment
然后nixops deploy -d mydeployment
完美运行:我得到一台运行Postgres 9.6并安装htop
的VirtualBox机器。
现在,将所有这些放在一个文件中似乎不是长期维护的好主意。
这是我想要的文件布局:
.
├── configuration-all.nix # forms a NixOs config with htop, postgres, etc.
├── htop.nix # NixOs config of just htop
├── postgres.nix # NixOs config of just Postgres
└── vbox-all.nix # NixOps config for virtualbox with htop, postgres, etc.
我的想法是vbox-all.nix
导入configuration-all.nix
导入我可能想要的所有服务/包/ conf(目前是postgres和htop)。
这是我无法开展的工作。
这是我的configuration-all.nix
:
{ config, pkgs, ... }:
{
imports = [ ./postgres.nix ./htop.nix ];
}
以下是./postgres.nix
:
{ config, pkgs, ... }:
{
services.postgresql.enable = true;
services.postgresql.package = pkgs.postgresql96;
}
我认为您可以猜出./htop.nix
的内容,无论如何它都无关紧要。
最后,我修改了vbox-all.nix
:
{
server =
{ config, pkgs, ... }:
with (pkgs.callPackage ./configuration-all.nix { });
{
# deployment-specific config
deployment.targetEnv = "virtualbox";
deployment.virtualbox.memorySize = 1024; # megabytes
deployment.virtualbox.vcpu = 2; # number of cpus
};
}
当我重新运行nixops deploy -d mydeployment
时,我没有收到任何错误,但生成的VM既没有postgres也没有htop。
我必须从根本上误解with
或callPackage
。对我来说应该:执行./configuration-all.nix
中定义的函数(自动填充所有参数)并将结果表达式与我的“特定于部署的配置”合并。
我尝试过以下几项:用pkgs.callPackage
替换import
(仍然没有错误,但仍然没有错误),使用inherit (pkgs.callPackage ./configuration-all.nix { })
代替with
等等。到目前为止没有骰子。
我必须遗漏一些小而且可能很明显......
答案 0 :(得分:2)
这是我最后的工作vbox-all.nix
我在写我的问题时想到了。
{
server =
{
imports = [ ./configuration-all.nix ];
# deployment-specific config
deployment.targetEnv = "virtualbox";
deployment.virtualbox.memorySize = 1024; # megabytes
deployment.virtualbox.vcpu = 2; # number of cpus
};
}
谢谢你,你是个好橡皮鸭。
我仍然需要了解为什么with
和inherit
的其他尝试无效,所以请不要犹豫,评论或发布替代答案。我有很多东西需要学习。