如何导入nixos配置并将其与nixops部署表达式合并

时间:2017-06-24 12:21:41

标签: nix nixos nixops

我正在学习如何使用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。

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

我尝试过以下几项:用pkgs.callPackage替换import(仍然没有错误,但仍然没有错误),使用inherit (pkgs.callPackage ./configuration-all.nix { })代替with等等。到目前为止没有骰子。

我必须遗漏一些小而且可能很明显......

1 个答案:

答案 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
    };
}
谢谢你,你是个好橡皮鸭。

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