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:
Oleg Pykhalov 2018-11-29 20:30:49 +03:00
parent 6b1c4179e2
commit 6106d7cae4
No known key found for this signature in database
GPG Key ID: 167F8EA5001AFA9C
3 changed files with 252 additions and 2 deletions

View File

@ -16800,6 +16800,109 @@ Defaults to @samp{()}.
@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

View File

@ -36,7 +36,9 @@
prometheus-node-exporter-service-type
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-fields))
'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))

View File

@ -235,6 +235,20 @@ zabbix||{}
'(file-exists? "/var/run/zabbix/zabbix_server.pid")
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)
(exit (= (test-runner-fail-count (test-runner-current)) 0)))))
@ -250,7 +264,9 @@ zabbix||{}
(service zabbix-server-service-type
(zabbix-server-configuration
(db-password "zabbix")
(log-type "console"))))))
(log-type "console")))
(service zabbix-agent-service-type))))
(operating-system
(inherit base-os)
(packages (cons* postgresql (operating-system-packages base-os))))))