<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: logiserv</title>
    <description>The latest articles on DEV Community by logiserv (@logiserv).</description>
    <link>https://dev.to/logiserv</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4202864%2F25dad1b5-3695-4bec-8b1e-c81dac90887d.png</url>
      <title>DEV Community: logiserv</title>
      <link>https://dev.to/logiserv</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/logiserv"/>
    <language>en</language>
    <item>
      <title>Testing a Zabbix Agent on Disposable VMs: 10 Silent Failures Found for a Few Cents</title>
      <dc:creator>logiserv</dc:creator>
      <pubDate>Sun, 25 Oct 2026 11:35:48 +0000</pubDate>
      <link>https://dev.to/logiserv/testing-a-zabbix-agent-on-disposable-vms-10-silent-failures-found-for-a-few-cents-458g</link>
      <guid>https://dev.to/logiserv/testing-a-zabbix-agent-on-disposable-vms-10-silent-failures-found-for-a-few-cents-458g</guid>
      <description>&lt;p&gt;An agent install script that prints "Installation completed successfully" proves very little. The agent can be running, connected to the server, and reporting &lt;strong&gt;wrong&lt;/strong&gt; values or &lt;strong&gt;nothing at all&lt;/strong&gt; on some checks, without a single error message.&lt;/p&gt;

&lt;p&gt;That is what we found while testing the Logiserv agent install script on brand-new virtual machines. Here is the method, what it cost, and the ten problems we found. Most of them affect any Zabbix installation, with or without Logiserv.&lt;/p&gt;

&lt;h2&gt;
  
  
  The method: VMs you delete instead of stopping
&lt;/h2&gt;

&lt;p&gt;To test a &lt;strong&gt;first install&lt;/strong&gt;, you need a clean machine every time. A reused VM keeps the agent, its configuration and its permissions: you are testing an upgrade, not an installation. Hence three rules:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Delete rather than stop.&lt;/strong&gt; A stopped instance no longer costs compute, but its disk is still billed. And a deleted VM starts clean next time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Self-destruction.&lt;/strong&gt; Each VM is launched with &lt;code&gt;shutdown -h +120&lt;/code&gt; in its user data and the shutdown behavior set to &lt;em&gt;Terminate&lt;/em&gt;: if forgotten, it disappears on its own after two hours.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No open ports.&lt;/strong&gt; Commands go through AWS Systems Manager (Run Command): no SSH, no keys to manage. The IAM account used can only launch small instances, only with a &lt;code&gt;Purpose=agent-test&lt;/code&gt; tag, and can only delete those.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Total cost for the day, five VMs included: &lt;strong&gt;a few cents&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Test a distribution family, not an architecture
&lt;/h2&gt;

&lt;p&gt;The first instinct is to test "one ARM Linux and one x86 Linux". But the script never distinguishes architecture: the Zabbix repository provides the right package. What it does split on is the &lt;strong&gt;family&lt;/strong&gt;: Debian/Ubuntu (&lt;code&gt;apt&lt;/code&gt;, repository built with &lt;code&gt;$ID$VERSION_ID&lt;/code&gt;), RHEL and derivatives (&lt;code&gt;dnf&lt;/code&gt;, &lt;code&gt;el9&lt;/code&gt; repository, SELinux), Amazon Linux, SUSE.&lt;/p&gt;

&lt;p&gt;The chosen matrix covers both axes with two VMs: &lt;strong&gt;Ubuntu 24.04 on ARM&lt;/strong&gt; and &lt;strong&gt;Rocky Linux 9 on x86&lt;/strong&gt;. Debian 12 came later, and it revealed its own problems (point 7).&lt;/p&gt;

&lt;h2&gt;
  
  
  2. The smallest VMs have their own failures
&lt;/h2&gt;

&lt;p&gt;Two false problems you need to learn to recognize:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;512 MB of memory is not enough for &lt;code&gt;dnf&lt;/code&gt;&lt;/strong&gt; on Rocky Linux: the repository index download is killed for lack of memory. A 1 GB instance fixes it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CPU credits.&lt;/strong&gt; A T3 instance in &lt;code&gt;standard&lt;/code&gt; mode starts with no credits and drops to 10% of a core once they run out. After a few SELinux recompilations, our counting commands took 13 seconds instead of 50 milliseconds, and the agent killed them after 3 seconds: "Timeout while executing a shell script". It wasn't the script, it was the VM.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. Under SELinux, wrong values with no error at all
&lt;/h2&gt;

&lt;p&gt;Rocky, AlmaLinux and RHEL enable SELinux in &lt;code&gt;enforcing&lt;/code&gt; mode. The policy shipped for the agent (&lt;code&gt;zabbix_agent_t&lt;/code&gt;) prevents it from reading &lt;code&gt;/var/log/secure&lt;/code&gt;, &lt;strong&gt;even with an ACL&lt;/strong&gt;, and from running &lt;code&gt;ip&lt;/code&gt;, &lt;code&gt;ss&lt;/code&gt;, &lt;code&gt;systemctl&lt;/code&gt; or &lt;code&gt;rpm&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The trap: an item &lt;code&gt;system.run["ss -tan state established | wc -l"]&lt;/code&gt; does not go into error. &lt;code&gt;ss&lt;/code&gt; is blocked, &lt;code&gt;wc -l&lt;/code&gt; counts zero lines, and Zabbix receives &lt;strong&gt;0&lt;/strong&gt;. The dashboard shows "0 established connections", with nothing red anywhere.&lt;/p&gt;

&lt;p&gt;The only way to see it is to look for denials:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ausearch &lt;span class="nt"&gt;-m&lt;/span&gt; AVC &lt;span class="nt"&gt;-ts&lt;/span&gt; recent &lt;span class="nt"&gt;-c&lt;/span&gt; zabbix_agentd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4. systemd denies too, and elsewhere
&lt;/h2&gt;

&lt;p&gt;An item checked the firewall state with &lt;code&gt;systemctl is-active firewalld&lt;/code&gt;. It returned: &lt;code&gt;Failed to retrieve unit state: Access denied&lt;/code&gt;. Yet there was no denial in &lt;code&gt;ausearch -m AVC&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The denial did not come from the kernel but from &lt;strong&gt;systemd itself&lt;/strong&gt;, which consults SELinux before answering (&lt;code&gt;init_t:system status&lt;/code&gt;). It is logged under a different type:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ausearch &lt;span class="nt"&gt;-m&lt;/span&gt; USER_AVC &lt;span class="nt"&gt;-ts&lt;/span&gt; recent | &lt;span class="nb"&gt;grep &lt;/span&gt;zabbix_agent_t
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  5. Denials hidden by the base policy
&lt;/h2&gt;

&lt;p&gt;Even with the agent's domain set to permissive, some denials did not show up. The SELinux policy contains &lt;code&gt;dontaudit&lt;/code&gt; rules that block &lt;strong&gt;without logging&lt;/strong&gt;. To see them during a diagnosis:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;semodule &lt;span class="nt"&gt;-DB&lt;/span&gt;   &lt;span class="c"&gt;# disable dontaudit&lt;/span&gt;
&lt;span class="c"&gt;# reproduce, then ausearch&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;semodule &lt;span class="nt"&gt;-B&lt;/span&gt;    &lt;span class="c"&gt;# restore them&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is how the denials for &lt;code&gt;ss&lt;/code&gt; on its netlink socket and for &lt;code&gt;rpm&lt;/code&gt; on its database appeared. The end result is a small SELinux module that grants only those reads and executions, and leaves SELinux in &lt;code&gt;enforcing&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. An ACL on /etc/shadow vanishes at the first password change
&lt;/h2&gt;

&lt;p&gt;To detect a change to &lt;code&gt;/etc/shadow&lt;/code&gt;, the template computed a checksum of the file. On RHEL there is no &lt;code&gt;shadow&lt;/code&gt; group, and the file is mode &lt;code&gt;0000&lt;/code&gt;. An ACL seems to work... until the first &lt;code&gt;passwd&lt;/code&gt; or &lt;code&gt;useradd&lt;/code&gt;: those tools rewrite the file (new inode) &lt;strong&gt;without copying the ACLs&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The solution is simpler and safer: track the &lt;strong&gt;modification time&lt;/strong&gt; (&lt;code&gt;vfs.file.time[/etc/shadow,modify]&lt;/code&gt;), which only needs a &lt;code&gt;stat&lt;/code&gt;. The agent no longer needs to read password hashes, on any distribution.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Debian 12 in the cloud: no logs, no cron
&lt;/h2&gt;

&lt;p&gt;Debian 12 cloud images install &lt;strong&gt;neither rsyslog nor cron&lt;/strong&gt;. &lt;code&gt;/var/log&lt;/code&gt; contains no &lt;code&gt;auth.log&lt;/code&gt;, no &lt;code&gt;syslog&lt;/code&gt;, no &lt;code&gt;kern.log&lt;/code&gt;: everything goes through journald.&lt;/p&gt;

&lt;p&gt;Consequence: the checks for failed SSH logins, &lt;code&gt;sudo&lt;/code&gt; commands or kernel errors read nothing. And an item &lt;code&gt;vfs.file.cksum[/etc/crontab]&lt;/code&gt; fails, since the file does not exist.&lt;/p&gt;

&lt;p&gt;A testing detail along the way: check for the presence of the &lt;strong&gt;daemon&lt;/strong&gt; (&lt;code&gt;command -v rsyslogd&lt;/code&gt;), not of the files. After rsyslog is removed, an old &lt;code&gt;auth.log&lt;/code&gt; stays in place, frozen, and makes you think everything is fine.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. A single failing item is enough to break a calculated score
&lt;/h2&gt;

&lt;p&gt;Security scores are &lt;strong&gt;calculated&lt;/strong&gt; items that add up around ten signals. If just one of those items is "not supported", Zabbix stops calculating anything: "Cannot evaluate function: item ... is not supported".&lt;/p&gt;

&lt;p&gt;A file that is absent on one distribution (&lt;code&gt;/var/log/syslog&lt;/code&gt; on RHEL, &lt;code&gt;/etc/crontab&lt;/code&gt; on Debian 12) is therefore enough to make the whole score disappear. Two fixes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;read logs with an expression that covers both families: &lt;code&gt;logrt["/var/log/^(syslog|messages)$",...]&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;for a legitimately absent file, add the preprocessing step &lt;strong&gt;"Check for not supported value"&lt;/strong&gt;, limited to the &lt;code&gt;No such file&lt;/code&gt; error, which replaces the failure with 0. Permission errors remain visible.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  9. Switching from log[] to logrt[] is not enough for agents already running
&lt;/h2&gt;

&lt;p&gt;After replacing &lt;code&gt;log["/var/log/syslog",...]&lt;/code&gt; with &lt;code&gt;logrt["/var/log/^(syslog|messages)$",...]&lt;/code&gt; in the template, two Ubuntu servers kept failing: "Cannot obtain information for file "/var/log/^(syslog|messages)$"". Yet the agent could read &lt;code&gt;/var/log/syslog&lt;/code&gt; without any problem.&lt;/p&gt;

&lt;p&gt;It was looking for a file with &lt;strong&gt;literally&lt;/strong&gt; that name. The item had kept the same ID, and the already-running agent had updated the key while keeping the old &lt;code&gt;log&lt;/code&gt; mode. New agents did not have the problem.&lt;/p&gt;

&lt;p&gt;Fix without restarting the agents: disable the items, wait a minute for the agent to forget them, then re-enable them.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. The agent log doesn't tell the whole story
&lt;/h2&gt;

&lt;p&gt;Last lesson, and the most general: the agent log is not enough to verify an installation.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Preprocessing is applied &lt;strong&gt;server-side&lt;/strong&gt;: the agent may log an error that the server then turns into a valid value.&lt;/li&gt;
&lt;li&gt;Some failures appear &lt;strong&gt;only server-side&lt;/strong&gt;, such as a &lt;code&gt;logrt&lt;/code&gt; with no matching file.&lt;/li&gt;
&lt;li&gt;Automatically discovered items (disks, network cards) only receive template changes at the &lt;strong&gt;next discovery run&lt;/strong&gt;, once an hour here.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The reliable check goes through the Zabbix API: &lt;code&gt;item.get&lt;/code&gt; with &lt;code&gt;filter: {state: 1}&lt;/code&gt; lists all failing items, across the whole fleet, in a single request.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we take away
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;An install test is judged server-side&lt;/strong&gt;, item by item, not by the script's final message.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SELinux doesn't break loudly&lt;/strong&gt;: it reports zeros. Look for &lt;code&gt;AVC&lt;/code&gt; &lt;strong&gt;and&lt;/strong&gt; &lt;code&gt;USER_AVC&lt;/code&gt;, with &lt;code&gt;dontaudit&lt;/code&gt; disabled.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Disposable VMs are the right cost scale&lt;/strong&gt;: one more distribution to test costs a cent and five minutes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All these fixes are built into the &lt;a href="https://www.logiserv.app/zabbix-saas?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=devto-organic&amp;amp;utm_content=tester-agent-zabbix-vm-jetables" rel="noopener noreferrer"&gt;Logiserv&lt;/a&gt; install script and its templates: a dedicated SELinux module, rsyslog installed when no syslog daemon is present, &lt;code&gt;/etc/shadow&lt;/code&gt; tracked by its modification time. For a manual install, the guides for &lt;a href="https://www.logiserv.app/blog/installer-zabbix-agent-rocky-linux?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=devto-organic&amp;amp;utm_content=tester-agent-zabbix-vm-jetables" rel="noopener noreferrer"&gt;Rocky Linux&lt;/a&gt;, &lt;a href="https://www.logiserv.app/blog/installer-zabbix-agent-debian?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=devto-organic&amp;amp;utm_content=tester-agent-zabbix-vm-jetables" rel="noopener noreferrer"&gt;Debian&lt;/a&gt; and &lt;a href="https://www.logiserv.app/blog/installer-zabbix-agent-amazon-linux?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=devto-organic&amp;amp;utm_content=tester-agent-zabbix-vm-jetables" rel="noopener noreferrer"&gt;Amazon Linux&lt;/a&gt; detail every command.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published in French on &lt;a href="https://www.logiserv.app/blog/tester-agent-zabbix-vm-jetables?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=devto-organic&amp;amp;utm_content=tester-agent-zabbix-vm-jetables" rel="noopener noreferrer"&gt;logiserv.app&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>zabbix</category>
      <category>monitoring</category>
      <category>selinux</category>
      <category>sysadmin</category>
    </item>
    <item>
      <title>Install Zabbix Agent 2 on Ubuntu 24.04 and 22.04 in 10 Minutes</title>
      <dc:creator>logiserv</dc:creator>
      <pubDate>Sat, 24 Oct 2026 07:51:21 +0000</pubDate>
      <link>https://dev.to/logiserv/install-zabbix-agent-2-on-ubuntu-2404-and-2204-in-10-minutes-2hca</link>
      <guid>https://dev.to/logiserv/install-zabbix-agent-2-on-ubuntu-2404-and-2204-in-10-minutes-2hca</guid>
      <description>&lt;p&gt;To monitor an Ubuntu server with Zabbix, you need to install an &lt;strong&gt;agent&lt;/strong&gt;: a lightweight service that collects system metrics (CPU load, memory, filesystem usage, running services, logs) and sends them to the monitoring server. See the &lt;a href="https://www.logiserv.app/glossaire/agent-zabbix" rel="noopener noreferrer"&gt;full definition of the Zabbix agent&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This guide covers the &lt;strong&gt;complete manual installation&lt;/strong&gt; on Ubuntu Server 20.04 LTS, 22.04 LTS and 24.04 LTS. The procedure works with any Zabbix server.&lt;/p&gt;

&lt;h2&gt;
  
  
  The easy way: with Logiserv
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.logiserv.app/zabbix-saas" rel="noopener noreferrer"&gt;Logiserv&lt;/a&gt; is built on this same Zabbix engine and automates everything. From the &lt;strong&gt;Agent&lt;/strong&gt; page of the dashboard, a command is generated for your fleet:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sSL&lt;/span&gt; &lt;span class="s2"&gt;"https://www.logiserv.app/api/agent-script/linux?token=..."&lt;/span&gt; | &lt;span class="nb"&gt;sudo &lt;/span&gt;bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The script detects the distribution, adds the repository, installs the package, &lt;strong&gt;gets a unique PSK key&lt;/strong&gt; for the system from the server, writes the configuration, creates the host on the server side with the right templates, adjusts the permissions needed for security metrics and starts the service.&lt;/p&gt;

&lt;p&gt;Allow &lt;strong&gt;1 to 2 minutes&lt;/strong&gt; per system with Logiserv. The detailed manual installation below takes 6 steps and about 10 minutes per server, not counting host creation on the Zabbix server side. See the detailed comparison.&lt;/p&gt;

&lt;h2&gt;
  
  
  Agent 1 or Agent 2?
&lt;/h2&gt;

&lt;p&gt;Two packages coexist in the official repository:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;zabbix-agent&lt;/code&gt;: the legacy agent written in C, configuration file &lt;code&gt;zabbix_agentd.conf&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;zabbix-agent2&lt;/code&gt;: the current version written in Go, configuration file &lt;code&gt;zabbix_agent2.conf&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Agent 2 is recommended&lt;/strong&gt; for any new installation: built-in plugins (PostgreSQL, MySQL, Docker, Redis…), a single persistent connection to the server, lower memory footprint. This guide uses Agent 2; the commands for Agent 1 are identical if you replace &lt;code&gt;agent2&lt;/code&gt; with &lt;code&gt;agent&lt;/code&gt; everywhere.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; The package provided by the Ubuntu repositories (&lt;code&gt;universe&lt;/code&gt;) is often much older than the current version. Use the official Zabbix repository described below to get an up-to-date version aligned with your server.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;sudo&lt;/strong&gt; access on the system&lt;/li&gt;
&lt;li&gt;the IP address or DNS name of your Zabbix server&lt;/li&gt;
&lt;li&gt;outbound network access to port &lt;strong&gt;10051/TCP&lt;/strong&gt; on the server&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 1: add the official Zabbix repository
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;zabbix-release&lt;/code&gt; package name includes the Ubuntu version. For &lt;strong&gt;Ubuntu 24.04&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wget https://repo.zabbix.com/zabbix/7.4/release/ubuntu/pool/main/z/zabbix-release/zabbix-release_latest+ubuntu24.04_all.deb
&lt;span class="nb"&gt;sudo &lt;/span&gt;dpkg &lt;span class="nt"&gt;-i&lt;/span&gt; zabbix-release_latest+ubuntu24.04_all.deb
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For &lt;strong&gt;Ubuntu 22.04&lt;/strong&gt;, replace &lt;code&gt;ubuntu24.04&lt;/code&gt; with &lt;code&gt;ubuntu22.04&lt;/code&gt;; for &lt;strong&gt;20.04&lt;/strong&gt;, with &lt;code&gt;ubuntu20.04&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Automatic version, whatever the release:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;.&lt;/span&gt; /etc/os-release
wget &lt;span class="nt"&gt;-qO&lt;/span&gt; /tmp/zabbix-release.deb &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"https://repo.zabbix.com/zabbix/7.4/release/ubuntu/pool/main/z/zabbix-release/zabbix-release_latest+ubuntu&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VERSION_ID&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;_all.deb"&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;dpkg &lt;span class="nt"&gt;-i&lt;/span&gt; /tmp/zabbix-release.deb
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 2: install the agent
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; zabbix-agent2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The package creates the &lt;code&gt;zabbix&lt;/code&gt; system user, installs the systemd unit and places the configuration file in &lt;code&gt;/etc/zabbix/&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;To also install the optional plugins (PostgreSQL, MongoDB, MSSQL):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; zabbix-agent2-plugin-&lt;span class="k"&gt;*&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 3: configure the agent
&lt;/h2&gt;

&lt;p&gt;Edit &lt;code&gt;/etc/zabbix/zabbix_agent2.conf&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /etc/zabbix/zabbix_agent2.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The essential directives:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="c"&gt;# Server allowed to query this agent (passive mode)
&lt;/span&gt;&lt;span class="py"&gt;Server&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;192.168.1.10&lt;/span&gt;
&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# Server to which the agent pushes its metrics (active mode)
&lt;/span&gt;&lt;span class="py"&gt;ServerActive&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;192.168.1.10&lt;/span&gt;
&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# Must match EXACTLY the host name defined on the Zabbix server side
&lt;/span&gt;&lt;span class="py"&gt;Hostname&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;srv-web-01&lt;/span&gt;
&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="py"&gt;LogFile&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/var/log/zabbix/zabbix_agent2.log&lt;/span&gt;
&lt;span class="py"&gt;LogFileSize&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;10&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The Hostname pitfall
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;Hostname&lt;/code&gt; value must be &lt;strong&gt;strictly identical&lt;/strong&gt; to the "Host name" field of the host created in the Zabbix interface. A case difference is enough for active checks to never report, with no explicit error on the server side.&lt;/p&gt;

&lt;p&gt;To automatically use the system's name:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="py"&gt;HostnameItem&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;system.hostname&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Active or passive mode
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Passive&lt;/strong&gt; (&lt;code&gt;Server=&lt;/code&gt;): the server queries the agent, which must be reachable on port 10050. Problematic behind NAT.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Active&lt;/strong&gt; (&lt;code&gt;ServerActive=&lt;/code&gt;): the agent pushes its data. &lt;strong&gt;No inbound port to open&lt;/strong&gt;, preferable for remote or cloud systems.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both modes can coexist.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; &lt;strong&gt;Don't feel like going through the next steps?&lt;/strong&gt; The PSK key, copying it to the server, creating the host and starting the service are where mistakes happen most. With &lt;a href="https://www.logiserv.app/zabbix-saas" rel="noopener noreferrer"&gt;Logiserv&lt;/a&gt;, a single command does them all, with a unique key per system. &lt;a href="https://www.logiserv.app/register" rel="noopener noreferrer"&gt;Try it for free, no credit card&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Step 4: encrypt the connection with a PSK key
&lt;/h2&gt;

&lt;p&gt;Without encryption, metrics travel in clear text. Generate a 32-byte key:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /etc/zabbix
openssl rand &lt;span class="nt"&gt;-hex&lt;/span&gt; 32 | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /etc/zabbix/zabbix_agent2.psk &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /dev/null
&lt;span class="nb"&gt;sudo chown &lt;/span&gt;zabbix:zabbix /etc/zabbix/zabbix_agent2.psk
&lt;span class="nb"&gt;sudo chmod &lt;/span&gt;600 /etc/zabbix/zabbix_agent2.psk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Complete the configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="py"&gt;TLSConnect&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;psk&lt;/span&gt;
&lt;span class="py"&gt;TLSAccept&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;psk&lt;/span&gt;
&lt;span class="py"&gt;TLSPSKIdentity&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;PSK-srv-web-01&lt;/span&gt;
&lt;span class="py"&gt;TLSPSKFile&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/etc/zabbix/zabbix_agent2.psk&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Copy the same key and identity into the &lt;strong&gt;Encryption&lt;/strong&gt; tab of the host on the server side. Use a distinct identity per system: a compromised shared key exposes the whole fleet.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Warning:&lt;/strong&gt; &lt;code&gt;openssl rand -hex 32&lt;/code&gt; appends a newline. Zabbix generally tolerates it, but in case of a &lt;code&gt;SSL alert number 40&lt;/code&gt; error, remove it: &lt;code&gt;sudo truncate -s 64 /etc/zabbix/zabbix_agent2.psk&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Step 5: open the port in the firewall
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; &lt;strong&gt;With Logiserv, this step is unnecessary.&lt;/strong&gt; The install command generated from the Agent page configures the agent in active mode only: it connects itself outbound to the Logiserv server on port 10051/TCP and listens on no port. No inbound port to open, no firewall rule to create.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Only in &lt;strong&gt;passive mode&lt;/strong&gt;. With UFW:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw allow from 192.168.1.10 to any port 10050 proto tcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Restricting to the Zabbix server's address avoids exposing the agent to the whole network. In active mode, no inbound rule is needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6: start and verify
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; &lt;span class="nt"&gt;--now&lt;/span&gt; zabbix-agent2
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl status zabbix-agent2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Test a metric locally, without going through the server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;zabbix_agent2 &lt;span class="nt"&gt;-t&lt;/span&gt; system.cpu.load[all,avg1]
zabbix_agent2 &lt;span class="nt"&gt;-t&lt;/span&gt; vfs.fs.size[/,pfree]
zabbix_agent2 &lt;span class="nt"&gt;-t&lt;/span&gt; agent.version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A response like &lt;code&gt;system.cpu.load[all,avg1] [d|0.080000]&lt;/code&gt; confirms collection works.&lt;/p&gt;

&lt;p&gt;Check the log:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo tail&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; /var/log/zabbix/zabbix_agent2.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Common error messages
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Message&lt;/th&gt;
&lt;th&gt;Likely cause&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;no active checks on server&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Hostname&lt;/code&gt; doesn't match any host on the server side&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SSL alert number 40&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;PSK key or identity mismatch between agent and server&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;connection refused&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Service stopped, or port 10050 filtered&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;Permission denied&lt;/code&gt; on a log&lt;/td&gt;
&lt;td&gt;The &lt;code&gt;zabbix&lt;/code&gt; user isn't in the &lt;code&gt;adm&lt;/code&gt; group&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;On that last point, some security metrics require access to system logs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;usermod &lt;span class="nt"&gt;-aG&lt;/span&gt; adm zabbix
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart zabbix-agent2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Monitoring multiple Ubuntu servers
&lt;/h2&gt;

&lt;p&gt;Repeated on twenty systems, this procedure becomes costly: repository, package, configuration, unique PSK key, host creation on the server side, key copying. Allow ten minutes per server, with as many opportunities for drift.&lt;/p&gt;

&lt;p&gt;The classic approaches: &lt;strong&gt;Ansible&lt;/strong&gt; or an equivalent configuration tool (robust, but playbooks and a secrets vault to maintain), &lt;strong&gt;cloud-init&lt;/strong&gt; at provisioning, or &lt;strong&gt;Zabbix auto-registration&lt;/strong&gt; with actions and host metadata configured on the server side.&lt;/p&gt;

&lt;h2&gt;
  
  
  At scale
&lt;/h2&gt;

&lt;p&gt;On a much larger fleet, a commenter on r/zabbix (u/fabomajstor, shared with permission) runs it end to end in about 30 seconds per server:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Provisioning&lt;/strong&gt;: Red Hat Satellite deploys the host, then Ansible installs the agent, creates the &lt;code&gt;zabbix&lt;/code&gt; user and its sudoers rules, configures the local firewall and writes the agent config.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Passive checks&lt;/strong&gt;: on a closed network, the server and proxies do the polling, so scheduling and load stay central. &lt;code&gt;Server=&lt;/code&gt; is restricted to the authorized server and proxy IPs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One PSK per host&lt;/strong&gt;: generated during provisioning and stored encrypted on the host. No recovery: if a key is in doubt, the host config is destroyed and rebuilt with a new one, so there is no key escrow to protect.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Registration&lt;/strong&gt;: the Zabbix API attaches templates, host groups and inventory automatically.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hardening&lt;/strong&gt;: &lt;code&gt;DenyKey=system.run[*]&lt;/code&gt;. If none of your templates use &lt;code&gt;system.run&lt;/code&gt;, that line alone closes the remote command path. &lt;code&gt;AllowKey&lt;/code&gt; is only needed for a few explicit exceptions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Discussion on r/zabbix: &lt;a href="https://www.reddit.com/r/zabbix/comments/1xebg9x/zabbix_agent_2_on_ubuntu_24042204_the_6_steps_and/" rel="noopener noreferrer"&gt;https://www.reddit.com/r/zabbix/comments/1xebg9x/zabbix_agent_2_on_ubuntu_24042204_the_6_steps_and/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The same installation with Logiserv
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.logiserv.app/zabbix-saas" rel="noopener noreferrer"&gt;Logiserv&lt;/a&gt; is built on this same Zabbix engine and automates everything. From the &lt;strong&gt;Agent&lt;/strong&gt; page of the dashboard, a command is generated for your fleet:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sSL&lt;/span&gt; &lt;span class="s2"&gt;"https://www.logiserv.app/api/agent-script/linux?token=..."&lt;/span&gt; | &lt;span class="nb"&gt;sudo &lt;/span&gt;bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The script detects the distribution, adds the repository, installs the package, &lt;strong&gt;gets a unique PSK key&lt;/strong&gt; for the system from the server, writes the configuration, creates the host on the server side with the right templates, adjusts the permissions needed for security metrics and starts the service.&lt;/p&gt;

&lt;h3&gt;
  
  
  Manual installation vs. Logiserv
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Manual installation (this guide)&lt;/th&gt;
&lt;th&gt;With Logiserv&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Steps&lt;/td&gt;
&lt;td&gt;6 steps, about fifteen commands&lt;/td&gt;
&lt;td&gt;1 copy-pasted command&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Time per server&lt;/td&gt;
&lt;td&gt;About 10 minutes, excluding host creation&lt;/td&gt;
&lt;td&gt;1 to 2 minutes, everything included&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Repository&lt;/td&gt;
&lt;td&gt;Package to pick according to the Ubuntu version&lt;/td&gt;
&lt;td&gt;Detected automatically&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Configuration file&lt;/td&gt;
&lt;td&gt;Edited by hand&lt;/td&gt;
&lt;td&gt;Written by the script&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PSK key&lt;/td&gt;
&lt;td&gt;To generate, secure, then copy to the server side&lt;/td&gt;
&lt;td&gt;Unique, generated and registered automatically&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Host on the Zabbix server&lt;/td&gt;
&lt;td&gt;To create in the interface, templates to link&lt;/td&gt;
&lt;td&gt;Created automatically in the fleet's group&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Firewall&lt;/td&gt;
&lt;td&gt;UFW rule in passive mode&lt;/td&gt;
&lt;td&gt;No inbound port&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Zabbix server&lt;/td&gt;
&lt;td&gt;To host, secure, back up, update&lt;/td&gt;
&lt;td&gt;Hosted and maintained by Logiserv&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dashboards and alerts&lt;/td&gt;
&lt;td&gt;To build&lt;/td&gt;
&lt;td&gt;Included, ready to use&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Recognized distributions:&lt;/strong&gt; Ubuntu, Debian, Raspberry Pi OS, RHEL, Rocky, AlmaLinux, Amazon Linux, SLES. The distribution is detected automatically via /etc/os-release.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Encryption:&lt;/strong&gt; unique PSK per system. 32-byte key generated at enrollment, never shared between two hosts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inbound port required:&lt;/strong&gt; none. Active mode: only outbound traffic to the server is needed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Log permissions:&lt;/strong&gt; configured automatically. The zabbix user is added to the adm and shadow groups for security checks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;How the Agent page works is detailed in the &lt;a href="https://www.logiserv.app/blog/agent" rel="noopener noreferrer"&gt;Logiserv documentation&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Going further
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.logiserv.app/blog/installer-zabbix-agent-2" rel="noopener noreferrer"&gt;Install Zabbix Agent 2: the per-system guide&lt;/a&gt;: overview and other OSes&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.logiserv.app/blog/installer-zabbix-agent-debian" rel="noopener noreferrer"&gt;Install Zabbix Agent on Debian&lt;/a&gt;: the differences from Ubuntu&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.logiserv.app/blog/installer-zabbix-agent-rocky-linux" rel="noopener noreferrer"&gt;Install Zabbix Agent on Rocky Linux&lt;/a&gt; and &lt;a href="https://www.logiserv.app/blog/installer-zabbix-agent-almalinux" rel="noopener noreferrer"&gt;AlmaLinux&lt;/a&gt;: the RHEL family&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.logiserv.app/blog/pourquoi-superviser-serveur-linux" rel="noopener noreferrer"&gt;Why monitor a Linux server&lt;/a&gt;: what monitoring detects before the incident&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.logiserv.app/blog/surveiller-espace-disque-serveur" rel="noopener noreferrer"&gt;Monitoring a server's disk space&lt;/a&gt;: the most frequent and most avoidable outage&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.logiserv.app/monitoring-serveur" rel="noopener noreferrer"&gt;Windows and Linux server monitoring: the guide&lt;/a&gt;: the complete approach&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Originally published in French on &lt;a href="https://www.logiserv.app/blog/installer-zabbix-agent-ubuntu" rel="noopener noreferrer"&gt;logiserv.app&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>zabbix</category>
      <category>ubuntu</category>
      <category>monitoring</category>
      <category>sysadmin</category>
    </item>
  </channel>
</rss>
