3

我正在学习如何使用 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完美运行:我得到了一台运行并htop安装了 Postgres 9.6 的 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我可能想要的所有服务/包/配置(当前是 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。

我必须从根本上误解要么withcallPackage。对我来说,它应该:执行./configuration-all.nix(自动填充所有参数)中定义的函数并将结果表达式与我的“特定于部署的配置”合并。

我尝试了一些方法,例如:替换pkgs.callPackageimport(仍然没有错误,但仍然不好),使用inherit (pkgs.callPackage ./configuration-all.nix { })而不是with,等等,但到目前为止还没有骰子。

我一定遗漏了一些小东西,而且可能很明显......

4

1 回答 1

3

这是我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
    };
}

谢谢所以,你是一个很好的橡皮鸭。

我仍然需要了解为什么我的其他尝试withinherit没有奏效,所以不要犹豫发表评论或发布替代答案。我有很多要学习的。

于 2017-06-24T12:21:41.040 回答