services: monitoring: Add 'zabbix-agent'.
* gnu/services/monitoring.scm (zabbix-server-service-type, zabbix-agent-account, zabbix-agent-activation, zabbix-agent-config-file, zabbix-agent-shepherd-service, generate-zabbix-agent-documentation): New procedures. (zabbix-agent-service-type): New 'service-type'. * gnu/tests/monitoring.scm (run-zabbix-server-test): Test 'zabbix-agent'. (%zabbix-os): Add 'zabbix-agent' service. * doc/guix.texi (Monitoring Services): Document 'zabbix-agent'.
This commit is contained in:
parent
6b1c4179e2
commit
6106d7cae4
103
doc/guix.texi
103
doc/guix.texi
|
@ -16800,6 +16800,109 @@ Defaults to @samp{()}.
|
||||||
|
|
||||||
@end deftypevr
|
@end deftypevr
|
||||||
|
|
||||||
|
@c %end of fragment
|
||||||
|
|
||||||
|
@subsubheading Zabbix agent
|
||||||
|
@cindex zabbix zabbix-agent
|
||||||
|
|
||||||
|
Zabbix agent gathers information for Zabbix server.
|
||||||
|
|
||||||
|
@c %start of fragment
|
||||||
|
|
||||||
|
Available @code{zabbix-agent-configuration} fields are:
|
||||||
|
|
||||||
|
@deftypevr {@code{zabbix-agent-configuration} parameter} package zabbix-agent
|
||||||
|
The zabbix-agent package.
|
||||||
|
|
||||||
|
@end deftypevr
|
||||||
|
|
||||||
|
@deftypevr {@code{zabbix-agent-configuration} parameter} string user
|
||||||
|
User who will run the Zabbix agent.
|
||||||
|
|
||||||
|
Defaults to @samp{"zabbix"}.
|
||||||
|
|
||||||
|
@end deftypevr
|
||||||
|
|
||||||
|
@deftypevr {@code{zabbix-agent-configuration} parameter} group group
|
||||||
|
Group who will run the Zabbix agent.
|
||||||
|
|
||||||
|
Defaults to @samp{"zabbix"}.
|
||||||
|
|
||||||
|
@end deftypevr
|
||||||
|
|
||||||
|
@deftypevr {@code{zabbix-agent-configuration} parameter} string hostname
|
||||||
|
Unique, case sensitive hostname which is required for active checks and
|
||||||
|
must match hostname as configured on the server.
|
||||||
|
|
||||||
|
Defaults to @samp{"Zabbix server"}.
|
||||||
|
|
||||||
|
@end deftypevr
|
||||||
|
|
||||||
|
@deftypevr {@code{zabbix-agent-configuration} parameter} string log-type
|
||||||
|
Specifies where log messages are written to:
|
||||||
|
|
||||||
|
@itemize @bullet
|
||||||
|
@item
|
||||||
|
@code{system} - syslog.
|
||||||
|
|
||||||
|
@item
|
||||||
|
@code{file} - file specified with @code{log-file} parameter.
|
||||||
|
|
||||||
|
@item
|
||||||
|
@code{console} - standard output.
|
||||||
|
|
||||||
|
@end itemize
|
||||||
|
|
||||||
|
Defaults to @samp{""}.
|
||||||
|
|
||||||
|
@end deftypevr
|
||||||
|
|
||||||
|
@deftypevr {@code{zabbix-agent-configuration} parameter} string log-file
|
||||||
|
Log file name for @code{log-type} @code{file} parameter.
|
||||||
|
|
||||||
|
Defaults to @samp{"/var/log/zabbix/agent.log"}.
|
||||||
|
|
||||||
|
@end deftypevr
|
||||||
|
|
||||||
|
@deftypevr {@code{zabbix-agent-configuration} parameter} string pid-file
|
||||||
|
Name of PID file.
|
||||||
|
|
||||||
|
Defaults to @samp{"/var/run/zabbix/zabbix_agent.pid"}.
|
||||||
|
|
||||||
|
@end deftypevr
|
||||||
|
|
||||||
|
@deftypevr {@code{zabbix-agent-configuration} parameter} list server
|
||||||
|
List of IP addresses, optionally in CIDR notation, or hostnames of
|
||||||
|
Zabbix servers and Zabbix proxies. Incoming connections will be
|
||||||
|
accepted only from the hosts listed here.
|
||||||
|
|
||||||
|
Defaults to @samp{("127.0.0.1")}.
|
||||||
|
|
||||||
|
@end deftypevr
|
||||||
|
|
||||||
|
@deftypevr {@code{zabbix-agent-configuration} parameter} list server-active
|
||||||
|
List of IP:port (or hostname:port) pairs of Zabbix servers and Zabbix
|
||||||
|
proxies for active checks. If port is not specified, default port is
|
||||||
|
used. If this parameter is not specified, active checks are disabled.
|
||||||
|
|
||||||
|
Defaults to @samp{("127.0.0.1")}.
|
||||||
|
|
||||||
|
@end deftypevr
|
||||||
|
|
||||||
|
@deftypevr {@code{zabbix-agent-configuration} parameter} string extra-options
|
||||||
|
Extra options will be appended to Zabbix server configuration file.
|
||||||
|
|
||||||
|
Defaults to @samp{""}.
|
||||||
|
|
||||||
|
@end deftypevr
|
||||||
|
|
||||||
|
@deftypevr {@code{zabbix-agent-configuration} parameter} include-files include-files
|
||||||
|
You may include individual files or all files in a directory in the
|
||||||
|
configuration file.
|
||||||
|
|
||||||
|
Defaults to @samp{()}.
|
||||||
|
|
||||||
|
@end deftypevr
|
||||||
|
|
||||||
@c %end of fragment
|
@c %end of fragment
|
||||||
|
|
||||||
|
|
|
@ -36,7 +36,9 @@
|
||||||
prometheus-node-exporter-service-type
|
prometheus-node-exporter-service-type
|
||||||
|
|
||||||
zabbix-server-configuration
|
zabbix-server-configuration
|
||||||
zabbix-server-service-type))
|
zabbix-server-service-type
|
||||||
|
zabbix-agent-configuration
|
||||||
|
zabbix-agent-service-type))
|
||||||
|
|
||||||
|
|
||||||
;;;
|
;;;
|
||||||
|
@ -314,3 +316,132 @@ configuration file."))
|
||||||
`((zabbix-server-configuration
|
`((zabbix-server-configuration
|
||||||
,zabbix-server-configuration-fields))
|
,zabbix-server-configuration-fields))
|
||||||
'zabbix-server-configuration))
|
'zabbix-server-configuration))
|
||||||
|
|
||||||
|
(define-configuration zabbix-agent-configuration
|
||||||
|
(zabbix-agent
|
||||||
|
(package zabbix-agentd)
|
||||||
|
"The zabbix-agent package.")
|
||||||
|
(user
|
||||||
|
(string "zabbix")
|
||||||
|
"User who will run the Zabbix agent.")
|
||||||
|
(group
|
||||||
|
(group "zabbix")
|
||||||
|
"Group who will run the Zabbix agent.")
|
||||||
|
(hostname
|
||||||
|
(string "Zabbix server")
|
||||||
|
"Unique, case sensitive hostname which is required for active checks and
|
||||||
|
must match hostname as configured on the server.")
|
||||||
|
(log-type
|
||||||
|
(string "")
|
||||||
|
"Specifies where log messages are written to:
|
||||||
|
@itemize
|
||||||
|
@item @code{system} - syslog.
|
||||||
|
@item @code{file} - file specified with @code{log-file} parameter.
|
||||||
|
@item @code{console} - standard output.
|
||||||
|
@end itemize\n")
|
||||||
|
(log-file
|
||||||
|
(string "/var/log/zabbix/agent.log")
|
||||||
|
"Log file name for @code{log-type} @code{file} parameter.")
|
||||||
|
(pid-file
|
||||||
|
(string "/var/run/zabbix/zabbix_agent.pid")
|
||||||
|
"Name of PID file.")
|
||||||
|
(server
|
||||||
|
(list '("127.0.0.1"))
|
||||||
|
"List of IP addresses, optionally in CIDR notation, or hostnames of Zabbix
|
||||||
|
servers and Zabbix proxies. Incoming connections will be accepted only from
|
||||||
|
the hosts listed here.")
|
||||||
|
(server-active
|
||||||
|
(list '("127.0.0.1"))
|
||||||
|
"List of IP:port (or hostname:port) pairs of Zabbix servers and Zabbix
|
||||||
|
proxies for active checks. If port is not specified, default port is used.
|
||||||
|
If this parameter is not specified, active checks are disabled.")
|
||||||
|
(extra-options
|
||||||
|
(string "")
|
||||||
|
"Extra options will be appended to Zabbix server configuration file.")
|
||||||
|
(include-files
|
||||||
|
(include-files '())
|
||||||
|
"You may include individual files or all files in a directory in the
|
||||||
|
configuration file."))
|
||||||
|
|
||||||
|
(define (zabbix-agent-account config)
|
||||||
|
"Return the user accounts and user groups for CONFIG."
|
||||||
|
(let ((zabbix-user "zabbix")
|
||||||
|
(zabbix-group "zabbix"))
|
||||||
|
(list (user-group (name zabbix-group) (system? #t))
|
||||||
|
(user-account
|
||||||
|
(name zabbix-user)
|
||||||
|
(system? #t)
|
||||||
|
(group zabbix-group)
|
||||||
|
(comment "zabbix privilege separation user")
|
||||||
|
(home-directory (string-append "/var/run/" zabbix-user))
|
||||||
|
(shell #~(string-append #$shadow "/sbin/nologin"))))))
|
||||||
|
|
||||||
|
(define (zabbix-agent-activation config)
|
||||||
|
"Return the activation gexp for CONFIG."
|
||||||
|
(with-imported-modules '((guix build utils)
|
||||||
|
(ice-9 rdelim))
|
||||||
|
#~(begin
|
||||||
|
(use-modules (guix build utils)
|
||||||
|
(ice-9 rdelim))
|
||||||
|
(let ((user
|
||||||
|
(getpw #$(zabbix-agent-configuration-user config))))
|
||||||
|
(for-each (lambda (file)
|
||||||
|
(let ((directory (dirname file)))
|
||||||
|
(mkdir-p directory)
|
||||||
|
(chown directory (passwd:uid user) (passwd:gid user))
|
||||||
|
(chmod directory #o755)))
|
||||||
|
(list #$(zabbix-agent-configuration-log-file config)
|
||||||
|
#$(zabbix-agent-configuration-pid-file config)))))))
|
||||||
|
|
||||||
|
(define (zabbix-agent-config-file config)
|
||||||
|
"Return the zabbix-agent configuration file corresponding to CONFIG."
|
||||||
|
(computed-file
|
||||||
|
"zabbix_agent.conf"
|
||||||
|
#~(begin
|
||||||
|
(call-with-output-file #$output
|
||||||
|
(lambda (port)
|
||||||
|
(display "# Generated by 'zabbix-agent-service'.\n" port)
|
||||||
|
(display #$(with-output-to-string
|
||||||
|
(lambda ()
|
||||||
|
(serialize-configuration
|
||||||
|
config zabbix-agent-configuration-fields)))
|
||||||
|
port)
|
||||||
|
#t)))))
|
||||||
|
|
||||||
|
(define (zabbix-agent-shepherd-service config)
|
||||||
|
"Return a <shepherd-service> for Zabbix agent with CONFIG."
|
||||||
|
(list (shepherd-service
|
||||||
|
(provision '(zabbix-agent))
|
||||||
|
(documentation "Run Zabbix agent daemon.")
|
||||||
|
(start #~(make-forkexec-constructor
|
||||||
|
(list #$(file-append (zabbix-agent-configuration-zabbix-agent config)
|
||||||
|
"/sbin/zabbix_agentd")
|
||||||
|
"--config" #$(zabbix-agent-config-file config)
|
||||||
|
"--foreground")
|
||||||
|
#:user #$(zabbix-agent-configuration-user config)
|
||||||
|
#:group #$(zabbix-agent-configuration-group config)
|
||||||
|
#:pid-file #$(zabbix-agent-configuration-pid-file config)
|
||||||
|
#:environment-variables
|
||||||
|
(list "SSL_CERT_DIR=/run/current-system/profile\
|
||||||
|
/etc/ssl/certs"
|
||||||
|
"SSL_CERT_FILE=/run/current-system/profile\
|
||||||
|
/etc/ssl/certs/ca-certificates.crt")))
|
||||||
|
(stop #~(make-kill-destructor)))))
|
||||||
|
|
||||||
|
(define zabbix-agent-service-type
|
||||||
|
(service-type
|
||||||
|
(name 'zabbix-agent)
|
||||||
|
(extensions
|
||||||
|
(list (service-extension shepherd-root-service-type
|
||||||
|
zabbix-agent-shepherd-service)
|
||||||
|
(service-extension account-service-type
|
||||||
|
zabbix-agent-account)
|
||||||
|
(service-extension activation-service-type
|
||||||
|
zabbix-agent-activation)))
|
||||||
|
(default-value (zabbix-agent-configuration))))
|
||||||
|
|
||||||
|
(define (generate-zabbix-agent-documentation)
|
||||||
|
(generate-documentation
|
||||||
|
`((zabbix-agent-configuration
|
||||||
|
,zabbix-agent-configuration-fields))
|
||||||
|
'zabbix-agent-configuration))
|
||||||
|
|
|
@ -235,6 +235,20 @@ zabbix||{}
|
||||||
'(file-exists? "/var/run/zabbix/zabbix_server.pid")
|
'(file-exists? "/var/run/zabbix/zabbix_server.pid")
|
||||||
marionette))
|
marionette))
|
||||||
|
|
||||||
|
;; Wait for zabbix-agent to be up and running.
|
||||||
|
(test-assert "zabbix-agent running"
|
||||||
|
(marionette-eval
|
||||||
|
'(begin
|
||||||
|
(use-modules (gnu services herd))
|
||||||
|
(start-service 'zabbix-agent))
|
||||||
|
marionette))
|
||||||
|
|
||||||
|
;; Make sure the PID file is created.
|
||||||
|
(test-assert "zabbix-agent PID file"
|
||||||
|
(marionette-eval
|
||||||
|
'(file-exists? "/var/run/zabbix/zabbix_agent.pid")
|
||||||
|
marionette))
|
||||||
|
|
||||||
(test-end)
|
(test-end)
|
||||||
|
|
||||||
(exit (= (test-runner-fail-count (test-runner-current)) 0)))))
|
(exit (= (test-runner-fail-count (test-runner-current)) 0)))))
|
||||||
|
@ -250,7 +264,9 @@ zabbix||{}
|
||||||
(service zabbix-server-service-type
|
(service zabbix-server-service-type
|
||||||
(zabbix-server-configuration
|
(zabbix-server-configuration
|
||||||
(db-password "zabbix")
|
(db-password "zabbix")
|
||||||
(log-type "console"))))))
|
(log-type "console")))
|
||||||
|
|
||||||
|
(service zabbix-agent-service-type))))
|
||||||
(operating-system
|
(operating-system
|
||||||
(inherit base-os)
|
(inherit base-os)
|
||||||
(packages (cons* postgresql (operating-system-packages base-os))))))
|
(packages (cons* postgresql (operating-system-packages base-os))))))
|
||||||
|
|
Loading…
Reference in New Issue