Message ID | 871rz99tl9.fsf_-_@sdf.lonestar.org |
---|---|
State | Accepted |
Headers | show |
Series | Add 'guix deploy'. | expand |
Hi Jakob, Thanks for working on this and for all the effort you've put into sharing your progress with the list. It's been interesting to watch from the sidelines. I don't know enough to say anything useful about the code changes, but here are a few minor comments about the guix.texi changes. zerodaysfordays@sdf.lonestar.org (Jakob L. Kreuze) writes: [...] > +The file should evaluate to a list of @var{machine} objects. This example, > +upon being deployed, will create a new generation on the remote system > +realizing the operating-system configuration @var{%system}. @var{environment} > +and @var{configuration} specify how the machine should be provisioned--that nitpick: Following the style used elsewhere in guix.texi, I think this "--" and the closing one below should be "---" with no surrounding spaces. > +is, deployment and management of computing resources. The above example does > +not provision any resources -- a @code{'managed-host} is a machine that is > +already up and running the Guix system. A more complex deployment may involve > +i.e. starting virtual machines through a VPS provider, however, in which case > +a different @var{environment} types would be used. This last sentence doesn't quite parse for me. Perhaps A more complex deployment may involve, for example, starting virtual machines through a VPS provider. In such as case, a different @var{environment} type would be used. ? [...] > +@item @code{environment} > +A symbol describing how the machine should be provisioned. At the moment, only > +the only supported value is @code{'managed-host}. Repeated "only". Also, as a meta nit: It'd be helpful if you'd mark updated patch series with the iteration count (e.g., v3). You can do this with git-format-patch's --reroll-count option.
Hi Kyle, Kyle Meyer <kyle@kyleam.com> writes: > nitpick: Following the style used elsewhere in guix.texi, I think this > "--" and the closing one below should be "---" with no surrounding > spaces. Yep, you're right. I cracked open the Texinfo manual and there indeed is a difference in how the two are parsed: the former is treated as an en dash while the latter is treated as an em dash. Thanks for pointing that out! > This last sentence doesn't quite parse for me. Perhaps > > A more complex deployment may involve, for example, starting virtual > machines through a VPS provider. In such as case, a different > @var{environment} type would be used. > > ? That's much clearer wording. I think I might use that verbatim. Also, I should probably be using two spaces to end my sentences as you did there :) > Repeated "only". Nice catch! > Also, as a meta nit: It'd be helpful if you'd mark updated patch > series with the iteration count (e.g., v3). You can do this with > git-format-patch's --reroll-count option. Oh awesome, I'll be sure to start using that. Thanks for the comments and the kind words, Jakob
zerodaysfordays@sdf.lonestar.org (Jakob L. Kreuze) writes: [...] >> This last sentence doesn't quite parse for me. Perhaps >> >> A more complex deployment may involve, for example, starting virtual >> machines through a VPS provider. In such as case, a different >> @var{environment} type would be used. >> >> ? > > That's much clearer wording. I think I might use that verbatim. Reading that again, I see my suggestion has a typo: s/as/a/
Kyle Meyer <kyle@kyleam.com> writes:
> Reading that again, I see my suggestion has a typo: s/as/a/
It's alright, I picked up on it as I was copying it in :)
Anyway, here's another revision updating the documentation. I had a go
at making the environment types more like the service types, in the
sense that configuration objects would be tied to the environment rather
than the machine, but that would involve introducing an 'environment'
object, which I thought to be too verbose.
#+BEGIN_SRC scheme
(list (machine
(system %system)
(environment
(environment managed-host-environment-type
(machine-ssh-configuration
(host-name "localhost")
(identity "./id_rsa")
(port 2222))))))
#+END_SRC
I suppose this could be avoided if I were to expose a different
constructor for 'machine'.
#+BEGIN_SRC scheme
(list (machine %system
(environment managed-host-environment-type
(machine-ssh-configuration
(host-name "localhost")
(identity "./id_rsa")
(port 2222)))))
#+END_SRC
I don't know if that's any better. Thoughts?
Jakob L. Kreuze (4):
ssh: Add 'identity' keyword to 'open-ssh-session'.
gnu: Add machine type for deployment specifications.
Add 'guix deploy'.
doc: Add section for 'guix deploy'.
Makefile.am | 4 +-
doc/guix.texi | 107 ++++++++++++
gnu/local.mk | 5 +-
gnu/machine.scm | 118 +++++++++++++
gnu/machine/ssh.scm | 363 ++++++++++++++++++++++++++++++++++++++++
guix/scripts/deploy.scm | 90 ++++++++++
guix/ssh.scm | 10 +-
7 files changed, 691 insertions(+), 6 deletions(-)
create mode 100644 gnu/machine.scm
create mode 100644 gnu/machine/ssh.scm
create mode 100644 guix/scripts/deploy.scm
diff --git a/doc/guix.texi b/doc/guix.texi index 9dc1d2a9c..23b7416ab 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -81,6 +81,7 @@ Documentation License''. * guix gc: (guix)Invoking guix gc. Reclaiming unused disk space. * guix pull: (guix)Invoking guix pull. Update the list of available packages. * guix system: (guix)Invoking guix system. Manage the operating system configuration. +* guix deploy: (guix)Invoking guix deploy. Manage operating system configurations for remote hosts. @end direntry @dircategory Software development @@ -269,6 +270,7 @@ System Configuration * Initial RAM Disk:: Linux-Libre bootstrapping. * Bootloader Configuration:: Configuring the boot loader. * Invoking guix system:: Instantiating a system configuration. +* Invoking guix deploy:: Deploying a system configuration to a remote host. * Running Guix in a VM:: How to run Guix System in a virtual machine. * Defining Services:: Adding new service definitions. @@ -10302,6 +10304,7 @@ instance to support new system services. * Initial RAM Disk:: Linux-Libre bootstrapping. * Bootloader Configuration:: Configuring the boot loader. * Invoking guix system:: Instantiating a system configuration. +* Invoking guix deploy:: Deploying a system configuration to a remote host. * Running Guix in a VM:: How to run Guix System in a virtual machine. * Defining Services:: Adding new service definitions. @end menu @@ -25335,6 +25338,104 @@ example graph. @end table +@node Invoking guix deploy +@section Invoking @code{guix deploy} + +In addition to managing a machine's configuration locally through operating +system declarations, Guix also provides the ability to managing multiple remote +hosts as a logical ``deployment''. This is done using @command{guix deploy}. + +@example +guix deploy @var{file} +@end example + +Such an invocation will deploy the machines that the code within @var{file} +evaluates to. As an example, @var{file} might contain a definition like this: + +@example +;; This is a Guix deployment of a "bare bones" setup, with +;; no X11 display server, to a machine with an SSH daemon +;; listening on localhost:2222. A configuration such as this +;; may be appropriate for virtual machine with ports +;; forwarded to the host's loopback interface. + +(use-service-modules networking ssh) +(use-package-modules bootloaders) + +(define %system + (operating-system + (host-name "gnu-deployed") + (timezone "Etc/UTC") + (bootloader (bootloader-configuration + (bootloader grub-bootloader) + (target "/dev/vda") + (terminal-outputs '(console)))) + (file-systems (cons (file-system + (mount-point "/") + (device "/dev/vda1") + (type "ext4")) + %base-file-systems)) + (services + (append (list (service dhcp-client-service-type) + (service openssh-service-type + (openssh-configuration + (permit-root-login #t) + (allow-empty-passwords? #t)))) + %base-services)))) + +(list (machine + (system %system) + (environment managed-host-environment-type) + (configuration (machine-ssh-configuration + (host-name "localhost") + (identity "./id_rsa") + (port 2222))))) +@end example + +The file should evaluate to a list of @var{machine} objects. This example, +upon being deployed, will create a new generation on the remote system +realizing the operating-system configuration @var{%system}. @var{environment} +and @var{configuration} specify how the machine should be provisioned--that +is, deployment and management of computing resources. The above example does +not provision any resources -- a @code{'managed-host} is a machine that is +already up and running the Guix system. A more complex deployment may involve +i.e. starting virtual machines through a VPS provider, however, in which case +a different @var{environment} types would be used. + +@deftp {Data Type} machine +This is the data type representing a single machine in a heterogeneous Guix +deployment. + +@table @asis +@item @code{system} +The object of the operating system configuration to deploy. + +@item @code{environment} +A symbol describing how the machine should be provisioned. At the moment, only +the only supported value is @code{'managed-host}. + +@item @code{configuration} (default: @code{#f}) +An object describing the configuration for the machine's @code{environment}. If +the @code{environment} has a default configuration, @code{#f} can be used. If +@code{#f} is used for an environment with no default configuration, however, an +error will be thrown. +@end table +@end deftp + +@deftp {Data Type} machine-ssh-configuration +This is the data type representing the SSH client parameters for connecting to a +@code{'managed-host}. + +@table @asis +@item @code{host-name} +@item @code{port} (default: @code{22}) +@item @code{user} (default: @code{"root"}) +@item @code{identity} (default: @code{#f}) +If specified, the path to the SSH private key to use to authenticate with the +remote host. +@end table +@end deftp + @node Running Guix in a VM @section Running Guix in a Virtual Machine