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

标签 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 的 VirtualBox 机器和 htop 已安装。

现在,将所有这些都放在一个文件中对于长期维护来说似乎不是一个好主意。

这是我想要的文件布局:

.
├── 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 等,但到目前为止还没有骰子。

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

最佳答案

这是我在写问题时想出的最终工作 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
    };
}

谢谢 SO,你是一只好橡皮鸭。

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

关于nix - 如何导入 nixos 配置并将其与 nixops 部署表达式合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44736322/

相关文章:

ocaml - 如何正确使用 nix-shell 并避免 "dumping very large path"?

development-environment - 有没有办法组合 Nix 表达式来为 `nix-shell` 创建开发环境

postgresql - 如何在 Nixos 上安装 postgresql-client/psql

nix - 覆盖 Nix 中的服务定义?

nix 用户包与系统包

nix - 如何在商店中找到派生路径,从编译后的包路径开始?

nix - 如何在 configuration.nix 中以声明方式添加 NixOS 不稳定 channel

NixOS 列出所有可能的配置选项

nix - 将 nixpkgs 结账传播到 NixOps 机器