【问题标题】:How to import nixos config and merge it with nixops deployment expression如何导入 nixos 配置并将其与 nixops 部署表达式合并
【发布时间】:2017-11-27 21:54:10
【问题描述】:

我正在学习如何使用 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 中定义的函数(自动填充所有参数)并将结果表达式与我的“特定于部署的配置”合并。

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

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

【问题讨论】:

    标签: nix nixos nixops


    【解决方案1】:

    这是我在写问题时发现的最后工作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 的其他尝试没有奏效,所以不要犹豫发表评论或发布替代答案。我有很多东西要学。

    【讨论】:

      猜你喜欢
      • 2020-11-07
      • 2017-04-25
      • 1970-01-01
      • 1970-01-01
      • 2015-09-05
      • 1970-01-01
      • 2017-05-09
      • 1970-01-01
      • 2012-11-26
      相关资源
      最近更新 更多