如何导入 nixos 配置并将其与 nixops 部署表达式合并
How to import nixos config and merge it with nixops deployment expression
我正在学习如何使用 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 运行ning 和 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
导入所有 services/packages/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
中定义的函数(自动填充所有参数)并将结果表达式与我的 "deployment-specific config".
合并
我尝试了一些方法,例如:用 import
替换 pkgs.callPackage
(仍然没有错误,但仍然不好),使用 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,你是一只好橡皮鸭。
我仍然需要了解为什么我对 with
和 inherit
的其他尝试没有奏效,所以请不要犹豫,发表评论或 post 替代答案。我还有很多东西要学。
我正在学习如何使用 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 运行ning 和 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
导入所有 services/packages/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
中定义的函数(自动填充所有参数)并将结果表达式与我的 "deployment-specific config".
我尝试了一些方法,例如:用 import
替换 pkgs.callPackage
(仍然没有错误,但仍然不好),使用 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,你是一只好橡皮鸭。
我仍然需要了解为什么我对 with
和 inherit
的其他尝试没有奏效,所以请不要犹豫,发表评论或 post 替代答案。我还有很多东西要学。