Added the nixos-deploy-network tool. With this tool you can write a network of NixOS configurations, e.g.:
{ test1 = {pkgs, config, ...}: { # NixOS config of machine test1 ... }; test2 = {pkgs, config, ...}: { # NixOS config of machine test2 ... }; } And an infrastructure expression, e.g: { test1 = { hostName = "test1.example.org"; system = "i686-linux"; }; test2 = { hostName = "test2.example.org"; system = "x86_64-linux"; }; } And by executing: nixos-deploy-network -n network.nix -i infrastructure.nix The system configurations in the network expression are built, transferred to the machines in the network and finally activated. svn path=/nixos/trunk/; revision=24146
This commit is contained in:
parent
d556b86f75
commit
122e125d6b
61
modules/installer/tools/nixos-deploy-network/deploy.nix
Normal file
61
modules/installer/tools/nixos-deploy-network/deploy.nix
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
{ nixos ? /etc/nixos/nixos
|
||||||
|
, nixpkgs ? /etc/nixos/nixpkgs
|
||||||
|
, networkExpr
|
||||||
|
, infrastructureExpr
|
||||||
|
}:
|
||||||
|
|
||||||
|
let
|
||||||
|
pkgs = import nixpkgs {};
|
||||||
|
|
||||||
|
inherit (builtins) attrNames getAttr listToAttrs concatMapStrings;
|
||||||
|
|
||||||
|
network = import networkExpr;
|
||||||
|
infrastructure = import infrastructureExpr;
|
||||||
|
|
||||||
|
generateScript = network: infrastructure: configs:
|
||||||
|
concatMapStrings (configurationName:
|
||||||
|
let
|
||||||
|
infrastructureElement = getAttr configurationName infrastructure;
|
||||||
|
config = getAttr configurationName configs;
|
||||||
|
in
|
||||||
|
''
|
||||||
|
echo "=== upgrading ${infrastructureElement.hostName} ==="
|
||||||
|
nix-copy-closure --to ${infrastructureElement.hostName} ${config.system.build.toplevel} \
|
||||||
|
&& ssh $NIX_SSHOPTS ${infrastructureElement.hostName} nix-env -p /nix/var/nix/profiles/system --set ${config.system.build.toplevel} \
|
||||||
|
&& ssh $NIX_SSHOPTS ${infrastructureElement.hostName} ${config.system.build.toplevel}/bin/switch-to-configuration switch \
|
||||||
|
&& { succeeded=$((succeeded + 1)); } \
|
||||||
|
|| { failed=$((failed + 1)); echo 'WARNING: upgrade of ${infrastructureElement.hostName} failed!'; }
|
||||||
|
''
|
||||||
|
) (attrNames network)
|
||||||
|
;
|
||||||
|
|
||||||
|
evaluateMachines = network: infrastructure:
|
||||||
|
listToAttrs (map (configurationName:
|
||||||
|
let
|
||||||
|
configuration = getAttr configurationName network;
|
||||||
|
system = (getAttr configurationName infrastructure).system;
|
||||||
|
in
|
||||||
|
{ name = configurationName;
|
||||||
|
value = (import "${nixos}/lib/eval-config.nix" {
|
||||||
|
inherit nixpkgs system;
|
||||||
|
modules = [ configuration ];
|
||||||
|
extraArgs = evaluateMachines network infrastructure;
|
||||||
|
}).config; }
|
||||||
|
) (attrNames (network)))
|
||||||
|
;
|
||||||
|
|
||||||
|
configs = evaluateMachines network infrastructure;
|
||||||
|
in
|
||||||
|
pkgs.stdenv.mkDerivation {
|
||||||
|
name = "deploy-script";
|
||||||
|
buildCommand = ''
|
||||||
|
ensureDir $out/bin
|
||||||
|
cat > $out/bin/deploy-systems << "EOF"
|
||||||
|
#! ${pkgs.stdenv.shell} -e
|
||||||
|
failed=0; succeeded=0
|
||||||
|
${generateScript network infrastructure configs}
|
||||||
|
echo "Upgrade of $failed machines failed, $succeeded machines succeeded.";
|
||||||
|
EOF
|
||||||
|
chmod +x $out/bin/deploy-systems
|
||||||
|
'';
|
||||||
|
}
|
@ -0,0 +1,73 @@
|
|||||||
|
#! @shell@ -e
|
||||||
|
|
||||||
|
# Shows the usage of this command to the user
|
||||||
|
|
||||||
|
showUsage()
|
||||||
|
{
|
||||||
|
echo "Usage: $0 -n network_expr -i infrastructure_expr"
|
||||||
|
echo "Options:"
|
||||||
|
echo
|
||||||
|
echo "-n,--network Network Nix expression which captures properties of machines in the network"
|
||||||
|
echo "-i,--infrastructure Infrastructure Nix expression which captures properties of machines in the network"
|
||||||
|
echo "-h,--help Shows the usage of this command"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Parse valid argument options
|
||||||
|
|
||||||
|
PARAMS=`getopt -n $0 -o n:i:h -l network:,infrastructure:,show-trace,help -- "$@"`
|
||||||
|
|
||||||
|
if [ $? != 0 ]
|
||||||
|
then
|
||||||
|
showUsage
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
eval set -- "$PARAMS"
|
||||||
|
|
||||||
|
# Evaluate valid options
|
||||||
|
|
||||||
|
while [ "$1" != "--" ]
|
||||||
|
do
|
||||||
|
case "$1" in
|
||||||
|
-n|--network)
|
||||||
|
networkExpr=`readlink -f $2`
|
||||||
|
;;
|
||||||
|
-i|--infrastructure)
|
||||||
|
infrastructureExpr=`readlink -f $2`
|
||||||
|
;;
|
||||||
|
--show-trace)
|
||||||
|
showTraceArg="--show-trace"
|
||||||
|
;;
|
||||||
|
-h|--help)
|
||||||
|
showUsage
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
|
||||||
|
# Validate the given options
|
||||||
|
|
||||||
|
if [ "$infrastructureExpr" = "" ]
|
||||||
|
then
|
||||||
|
echo "ERROR: A infrastructure expression must be specified!" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$networkExpr" = "" ]
|
||||||
|
then
|
||||||
|
echo "ERROR: A network expression must be specified!" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$NIXOS" ]
|
||||||
|
then
|
||||||
|
NIXOS=/etc/nixos/nixos
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Deploy the network
|
||||||
|
|
||||||
|
nix-build $NIXOS/deploy.nix --argstr networkExpr $networkExpr --argstr infrastructureExpr $infrastructureExpr $showTraceArg
|
||||||
|
./result/bin/deploy-systems
|
||||||
|
rm -f result
|
@ -11,6 +11,11 @@ let
|
|||||||
isExecutable = true;
|
isExecutable = true;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
nixosDeployNetwork = makeProg {
|
||||||
|
name = "nixos-deploy-network";
|
||||||
|
src = ./nixos-deploy-network/nixos-deploy-network.sh;
|
||||||
|
};
|
||||||
|
|
||||||
nixosInstall = makeProg {
|
nixosInstall = makeProg {
|
||||||
name = "nixos-install";
|
name = "nixos-install";
|
||||||
src = ./nixos-install.sh;
|
src = ./nixos-install.sh;
|
||||||
@ -126,7 +131,8 @@ in
|
|||||||
|
|
||||||
config = {
|
config = {
|
||||||
environment.systemPackages =
|
environment.systemPackages =
|
||||||
[ nixosInstall
|
[ nixosDeployNetwork
|
||||||
|
nixosInstall
|
||||||
nixosRebuild
|
nixosRebuild
|
||||||
nixosHardwareScan
|
nixosHardwareScan
|
||||||
nixosGenSeccureKeys
|
nixosGenSeccureKeys
|
||||||
|
Loading…
x
Reference in New Issue
Block a user