如何在NixOS的vhost.nix中循环创建指定用户?
Nix自定义模块中循环生成用户配置的解决方案
要实现像配置httpd.virtualHosts那样循环添加用户,你可以利用Nix的属性集处理函数自动生成用户配置,替代手动逐个定义的方式。
修改后的vhosts.nix完整代码
{ config, pkgs, lib, ... }: with lib; let cfg = config.vhosts; # 提取所有唯一的PHP用户(去重避免重复定义) phpUsers = unique (attrValues (mapAttrs (_: vhostCfg: vhostCfg.phpuser) cfg)); in { options.vhosts = mkOption { type = with types; attrsOf (submodule ({domain, ... }: { options = { customer = mkOption { type = str; }; phpuser = mkOption { type = str; }; }; })); }; config = { services.httpd.virtualHosts = mapAttrs (domain: vhostCfg: { documentRoot = "/srv/www/${vhostCfg.customer}/${domain}"; }) cfg; # 循环生成用户配置 users.users = genAttrs phpUsers (user: { isNormalUser = true; # 可按需添加更多用户默认配置,比如: # home = "/home/${user}"; # shell = pkgs.bash; }); }; }
关键逻辑说明
提取用户列表:
mapAttrs (_: vhostCfg: vhostCfg.phpuser) cfg:遍历所有虚拟主机配置,提取每个主机对应的phpuser字段,生成以域名为键、用户名为值的属性集。attrValues:将上述属性集的取值转换为列表(如["web2www1", "web3www1"])。unique:对用户列表去重,避免同一个用户被重复定义(适用于多个虚拟主机共享同一PHP用户的场景)。
生成用户配置:
genAttrs phpUsers (user: { ... }):将用户列表转换为users.users所需的属性集结构,每个用户名作为属性键,对应的值为该用户的配置(这里启用isNormalUser)。
这样修改后,你新增虚拟主机时只需在vm.nix的vhosts中定义phpuser,模块会自动生成对应的用户配置,无需手动添加用户条目。
内容的提问来源于stack exchange,提问作者Stefan Mielke
相关产品推荐
相关产品推荐

