5e6039b7038cf19232ed9511f5c32c890fc86403
[distorted-ansible] / hosts / host-defs.lisp
1 ;;; -*-lisp-*-
2
3 (cl:in-package #:ansible-inventory-user)
4
5 ;; Set `:vm-role' and `:guests' properties based on `:vm-host' backlinks from
6 ;; guests, and propagate `:location' and `:hypervisor' back to the guests.
7 (defhook (prio-props)
8 (dohosts (host)
9 (multiple-value-bind (vmhost foundp) (hostprop host :vm-host)
10 (when foundp
11 (hostprop-default vmhost :vm-role :host)
12 (hostprop-default host :vm-role :guest)
13 (pushnew host (hostprop vmhost :guests))
14 (dolist (prop '(:location :hypervisor))
15 (multiple-value-bind (value foundp) (hostprop vmhost prop)
16 (when foundp (hostprop-default host prop value))))))))
17
18 ;; Define groups for hosts, guests, clients, and servers.
19 (defhook (prio-groups)
20 (defgroup vm-hosts :predicate (host) (eq (hostprop host :vm-role) :host))
21 (defgroup vm-guests :predicate (host) (eq (hostprop host :vm-role) :guest))
22 (defgroup servers :predicate (host) (hostpropp host :server))
23 (defgroup clients :predicate (host) (hostpropp host :client)))
24
25 ;; For each VM host, define a group for its guests.
26 (defhook (prio-groups)
27 (dohosts (host)
28 (when (eq (hostprop host :vm-role) :host)
29 (add-group (intern (concatenate 'string (string host) "-guests"))
30 :predicate (lambda (h) (eql (hostprop h :vm-host) host))))))
31
32 ;; For each `:os' flavour, define a group of hosts running it.
33 (defhook (prio-groups)
34 (let ((oses nil))
35 (dohosts (host)
36 (multiple-value-bind (os foundp) (hostprop host :os)
37 (when foundp (pushnew os oses))))
38 (dolist (os-mut oses)
39 (let ((os os-mut))
40 (add-group (intern (concatenate 'string (string os) "-hosts"))
41 :predicate (lambda (h) (eql (hostprop h :os) os)))))))
42
43 ;; For each ROLE listed in a `:server' list, define a `ROLE-servers' group.
44 (defhook (prio-groups)
45 (let ((server-roles nil))
46 (dohosts (host)
47 (dolist (role (hostprop host :server))
48 (pushnew role server-roles)))
49 (dolist (r server-roles)
50 (let ((role r))
51 (add-group (intern (concatenate 'string (string role) "-servers"))
52 :predicate (lambda (h)
53 (member role (hostprop h :server))))))))
54
55 ;;;----- That's all, folks --------------------------------------------------