Some simplifications

This commit is contained in:
Ray Miller 2025-01-23 18:19:54 +00:00
parent e22e618142
commit 8a1e1b244f
Signed by: ray
GPG key ID: 043F786C4CD681B8
8 changed files with 78 additions and 27 deletions

34
examples/basic.scm Normal file
View file

@ -0,0 +1,34 @@
(use-modules
(ice-9 filesystem)
(ice-9 pretty-print)
(logging logger)
(ordo)
(ordo action filesystem))
(playbook
#:name "Basic filesystem operations"
#:plays (list
(play
#:name "Temporary files on localhost"
#:host "localhost"
#:tasks (list
(task #:name "Create temporary directory"
#:action (lambda () (fs:create-tmp-dir (current-connection)))
#:register-play-var #:tmp-dir)
(task #:name "Create hello.txt"
#:action (lambda () (fs:install-file (current-connection)
(file-name-join* ($ #:tmp-dir) "hello.txt")
#:content "Hello, world!"))
#:register-play-var #:hello)
(task #:name "Stat hello.txt"
#:action (lambda () (fs:stat (current-connection) ($ #:hello)))
#:register-play-var #:hello-stat)
(task #:name "Debug variables"
#:action (lambda ()
(pretty-print (list #:hello ($ #:hello) #:hello-stat ($ #:hello-stat)))))
(task #:name "Clean up tmp dir"
#:action (lambda () (fs:remove (current-connection) ($ #:tmp-dir) #:recurse? #t #:verbose? #t)))))))

View file

@ -19,10 +19,15 @@
(lambda ()
(run conn "rm" "-rf" tmp-dir)))))
(playbook "Test Playbook"
(play "Test play"
#:host "localhost"
(task
(install-aws-cli #:update? #t
#:install-dir (file-name-join* ($ #:fact.home-dir) ".local" "aws-cli")
#:bin-dir (file-name-join* ($ #:fact.home-dir) ".local" "bin")))))
(playbook
#:name "Test Playbook"
#:plays (list
(play
#:name "Test play"
#:host "localhost"
#:tasks (list
(task #:name "Install AWS CLI"
#:action (lambda ()
(install-aws-cli #:update? #t
#:install-dir (file-name-join* ($ #:fact.home-dir) ".local" "aws-cli")
#:bin-dir (file-name-join* ($ #:fact.home-dir) ".local" "bin"))))))))

View file

@ -36,13 +36,15 @@
((string-contains (first result) "No such file or directory") #f)
(else (error (format #f "stat ~a: ~a" path (first result)))))))
(define* (fs:remove conn path #:key (recurse? #f) (force? #f) (verbose? #t))
(run conn "rm" (chain-when '()
(verbose? (append _ '("-v")))
(recurse? (append _ '("-r")))
(force? (append _ '("-f")))
(#t (append _ `(,path))))
#:check? #t))
(define* (fs:remove conn path #:key (recurse? #f) (force? #f) (verbose? #f))
(let ((out (run conn "rm" (chain-when '()
(verbose? (append _ '("-v")))
(recurse? (append _ '("-r")))
(force? (append _ '("-f")))
(#t (append _ `(,path))))
#:check? #t)))
(when verbose?
(for-each (cut log-msg 'INFO <>) out))))
(define* (fs:link conn target link-name #:key (symbolic? #f) (force? #f) (backup? #f))
"Create a link to @code{target} with the name @code{link-name}."

View file

@ -1,5 +1,6 @@
(define-module (ordo cli)
#:use-module (ice-9 match)
#:use-module (logging logger)
#:use-module (ordo logger)
#:use-module (ordo context)
#:use-module (ordo playbook)
@ -9,8 +10,11 @@
(define (main args)
(match-let (((_ inventory-path playbook-path) args))
(setup-logging #:level 'DEBUG)
(log-msg 'DEBUG "Initializing context")
(init-context!)
(load inventory-path)
(log-msg 'DEBUG "Loaded inventory: " inventory-path)
(let ((playbook (load playbook-path)))
(log-msg 'DEBUG "Loaded playbook: " playbook-path)
(run-playbook playbook))
(quit)))

View file

@ -4,6 +4,7 @@
#:use-module (ice-9 match)
#:use-module (logging logger)
#:use-module (srfi srfi-1) ; list operations
#:use-module (srfi srfi-26) ; cut
#:use-module (srfi srfi-71) ; extended let
#:use-module (ordo connection base)
#:use-module (ordo connection local)

View file

@ -34,10 +34,9 @@
(handlers play-handlers)
(gather-facts play-gather-facts))
(define* (play name #:key host (sudo? #f) (sudo-user #f) (sudo-password #f) (vars '()) (gather-facts #t) . more)
(let ((tasks (filter task? more))
(handlers (filter handler? more)))
(make-play name host sudo? sudo-user sudo-password vars gather-facts tasks handlers)))
;; TODO: argument validation
(define* (play #:key name host (sudo? #f) (sudo-user #f) (sudo-password #f) (vars '()) (gather-facts #t) tasks (handlers '()))
(make-play name host sudo? sudo-user sudo-password vars gather-facts tasks handlers))
(define (run-play p)
(log-msg 'NOTICE "Running play: " (play-name p))

View file

@ -17,7 +17,8 @@
(vars playbook-vars)
(plays playbook-plays))
(define* (playbook name #:key (vars '()) . plays)
;; TODO: argument validation
(define* (playbook #:key name (vars '()) plays)
(make-playbook name vars plays))
(define (run-playbook pb)

View file

@ -1,4 +1,5 @@
(define-module (ordo task)
#:use-module (ice-9 exceptions)
#:use-module (srfi srfi-9)
#:use-module (logging logger)
#:use-module (ordo context)
@ -24,15 +25,19 @@
(register-playbook-var task-register-playbook-var)
(triggers task-triggers))
(define* (%task name action #:key (tags '()) (condition (const #t)) (register-play-var #f) (register-playbook-var #f) (triggers '()))
(make-task name tags action condition register-play-var register-playbook-var triggers))
(define-syntax task
(define-syntax assert
(syntax-rules ()
((task (f args ...) kwargs ...)
(%task (symbol->string 'f) (lambda () (f args ...) kwargs ...)))
((task name (f args ...) kwargs ...)
(%task name (lambda () (f args ...)) kwargs ...))))
((assert expr message irritant)
(unless expr
(raise-exception (make-exception
(make-assertion-failure)
(make-exception-with-message message)
(make-exception-with-irritants irritant)))))))
(define* (task #:key name action (tags '()) (condition (const #t)) (register-play-var #f) (register-playbook-var #f) (triggers '()))
(assert (and name (string? name)) "#:name is required and must be a string" name)
(assert (and action (procedure? action)) "#:action is required and must be a procedure" action)
(make-task name tags action condition register-play-var register-playbook-var triggers))
(define (run-task t)
(when (check-filter-tags (task-tags t))