This guide provides a complete Ansible playbook to install Netdata from official packages with proper configuration, Cloud integration, and security hardening.
Current Netdata version: 2.9.0
Create a file named netdata.yml:
---
- name: Install and Configure Netdata
hosts: netdata
become: true
vars:
netdata_version: "2.9.0"
netdata_port: 19999
netdata_config_dir: "/etc/netdata"
netdata_claim_token: "" # Optional: Netdata Cloud token
netdata_claim_url: "https://app.netdata.cloud"
tasks:
- name: Install prerequisites (Debian/Ubuntu)
apt:
name:
- curl
- wget
- git
- build-essential
- pkg-config
- zlib1g-dev
- libmnl-dev
- libuuid-dev
- libjson-c-dev
- libjudy-dev
- libuv1-dev
state: present
update_cache: true
when: ansible_os_family == "Debian"
- name: Install prerequisites (RHEL/CentOS)
yum:
name:
- curl
- wget
- git
- gcc
- make
- pkgconfig
- zlib-devel
- libmnl-devel
- libuuid-devel
- json-c-devel
- Judy-devel
- libuv-devel
state: present
when: ansible_os_family == "RedHat"
- name: Download and run Netdata installer
shell: |
wget -O /tmp/netdata-kickstart.sh https://get.netdata.cloud/kickstart.sh && \
chmod +x /tmp/netdata-kickstart.sh && \
NETDATA_BUILD_OPTIONS="--disable-go --disable-dbengine" /tmp/netdata-kickstart.sh --dont-wait --dont-start-it --non-interactive
args:
creates: /usr/sbin/netdata
register: install_result
- name: Stop Netdata service before configuration
systemd:
name: netdata
state: stopped
failed_when: false
- name: Configure Netdata web server
lineinfile:
path: "{{ netdata_config_dir }}/netdata.conf"
regexp: "^#?\s*{{ item.key }} ="
line: "{{ item.key }} = {{ item.value }}"
loop:
- { key: 'bind to', value: '*:{{ netdata_port }}' }
- { key: 'enable web notifications', value: 'yes' }
- { key: 'access log', value: 'none' }
- name: Configure Netdata for production
lineinfile:
path: "{{ netdata_config_dir }}/netdata.conf"
regexp: "^#?\s*{{ item.key }} ="
line: "{{ item.key }} = {{ item.value }}"
loop:
- { key: 'memory mode', value: 'dbengine' }
- { key: 'page cache size', value: 'auto' }
- { key: 'dbengine disk space', value: 'auto' }
- { key: 'update every', value: '1' }
- { key: 'history', value: '3600' }
- name: Configure streaming (optional)
lineinfile:
path: "{{ netdata_config_dir }}/stream.conf"
regexp: "^#?\s*{{ item.key }} ="
line: "{{ item.key }} = {{ item.value }}"
loop:
- { key: 'enabled', value: 'yes' }
- { key: 'default port', value: '{{ netdata_port }}' }
when: streaming_enabled | default(false)
- name: Enable and start Netdata
systemd:
name: netdata
enabled: true
state: started
daemon_reload: true
- name: Wait for Netdata to start
wait_for:
port: "{{ netdata_port }}"
delay: 3
timeout: 60
- name: Configure firewall (UFW)
ufw:
rule: allow
port: "{{ netdata_port }}"
proto: tcp
comment: "Netdata monitoring"
when: ansible_os_family == "Debian"
failed_when: false
- name: Configure firewall (firewalld)
firewalld:
port: "{{ netdata_port }}/tcp"
permanent: true
immediate: true
state: enabled
when: ansible_os_family == "RedHat"
failed_when: false
- name: Claim Netdata to Cloud (optional)
command: >
/usr/sbin/netdata-claim.sh
-token={{ netdata_claim_token }}
-rooms={{ netdata_claim_rooms | default('default') }}
-url={{ netdata_claim_url }}
when: netdata_claim_token | length > 0
failed_when: false
- name: Verify Netdata health
uri:
url: "http://localhost:{{ netdata_port }}/api/v1/info"
method: GET
return_content: true
register: health_check
retries: 3
delay: 2
until: health_check.status == 200
- name: Display Netdata status
debug:
msg: |
Netdata {{ netdata_version }} installed successfully!
Web Interface: http://{{ ansible_default_ipv4.address | default(ansible_host) }}:{{ netdata_port }}
{% if netdata_claim_token | length > 0 %}
Connected to Netdata Cloud: {{ netdata_claim_url }}
{% endif %}
Configuration directory: {{ netdata_config_dir }}
---
netdata:
hosts:
netdata-server:
ansible_host: 192.168.1.104
ansible_user: ansible
ansible_become: true
# Test connectivity
ansible all -i inventory.yml -m ping
# Run the Netdata playbook
ansible-playbook -i inventory.yml netdata.yml
# Run with Cloud claim token
ansible-playbook -i inventory.yml netdata.yml \
-e "netdata_claim_token=YOUR_TOKEN" \
-e "netdata_claim_rooms=default"
# Check service status
ssh netdata-server "sudo systemctl status netdata"
# Test health endpoint
curl http://netdata-server:19999/api/v1/info
# Access web UI
# http://netdata-server:19999
- name: Configure Netdata alerts
hosts: netdata
become: true
vars:
alert_email: "admin@example.com"
slack_webhook: "https://hooks.slack.com/services/XXX/YYY/ZZZ"
tasks:
- name: Configure email alerts
copy:
dest: "{{ netdata_config_dir }}/health_alarm_notify.conf"
owner: root
group: netdata
mode: '0640'
content: |
SEND_EMAIL="YES"
RECIPIENT_EMAIL="{{ alert_email }}"
SMTP_SERVER="smtp.example.com"
SMTP_PORT="587"
SMTP_USERNAME="netdata@example.com"
SMTP_PASSWORD="smtp_password"
- name: Configure Slack alerts
lineinfile:
path: "{{ netdata_config_dir }}/health_alarm_notify.conf"
regexp: "^SEND_SLACK="
line: 'SEND_SLACK="YES"'
- name: Create Slack configuration
copy:
dest: "{{ netdata_config_dir }}/slack.conf"
owner: root
group: netdata
mode: '0640'
content: |
SLACK_WEBHOOK_URL="{{ slack_webhook }}"
SLACK_CHANNEL="#monitoring"
- name: Restart Netdata
systemd:
name: netdata
state: restarted
---
- name: Install Netdata Agent on all monitored hosts
hosts: monitored_hosts
become: true
vars:
netdata_parent: "192.168.1.104"
tasks:
- name: Install prerequisites
apt:
name:
- curl
- wget
state: present
update_cache: true
when: ansible_os_family == "Debian"
- name: Download and run Netdata installer
shell: |
wget -O /tmp/netdata-kickstart.sh https://get.netdata.cloud/kickstart.sh && \
chmod +x /tmp/netdata-kickstart.sh && \
/tmp/netdata-kickstart.sh --dont-wait --dont-start-it --non-interactive
args:
creates: /usr/sbin/netdata
- name: Configure streaming to parent
lineinfile:
path: /etc/netdata/stream.conf
regexp: "^#?\s*{{ item.key }} ="
line: "{{ item.key }} = {{ item.value }}"
loop:
- { key: 'enabled', value: 'yes' }
- { key: 'destination', value: '{{ netdata_parent }}:19999' }
- { key: 'api key', value: 'auto' }
- name: Enable and start Netdata
systemd:
name: netdata
enabled: true
state: started
- name: Configure custom Netdata dashboard
hosts: netdata
become: true
tasks:
- name: Create custom dashboard directory
file:
path: "{{ netdata_config_dir }}/custom_dashboards"
state: directory
owner: netdata
group: netdata
mode: '0755'
- name: Add custom dashboard
copy:
dest: "{{ netdata_config_dir }}/custom_dashboards/system-overview.html"
owner: netdata
group: netdata
mode: '0644'
content: |
<!DOCTYPE html>
<html>
<head>
<title>System Overview</title>
<script type="text/javascript" src="/dashboard.js"></script>
</head>
<body>
<h1>System Overview Dashboard</h1>
<div data-netdata="system.cpu"
data-dimensions="user|system|idle"
data-chart-library="dygraph"
data-width="100%"
data-height="200px">
</div>
<div data-netdata="system.ram"
data-dimensions="free|used|cached"
data-chart-library="dygraph"
data-width="100%"
data-height="200px">
</div>
<div data-netdata="system.io"
data-chart-library="dygraph"
data-width="100%"
data-height="200px">
</div>
</body>
</html>
# Check logs
sudo journalctl -u netdata -f
# Check Netdata logs
sudo tail -f /var/log/netdata/error.log
# Test configuration
sudo /usr/sbin/netdata -W config-test
# Check memory mode
sudo grep "memory mode" /etc/netdata/netdata.conf
# Adjust database size
sudo nano /etc/netdata/netdata.conf
# Set: dbengine disk space = 256
# Check streaming configuration
sudo cat /etc/netdata/stream.conf
# Test connectivity to parent
telnet netdata-parent 19999
# Check parent logs
sudo tail -f /var/log/netdata/access.log
We develop tailored automation solutions for:
Let’s discuss your requirements: office@linux-server-admin.com | Contact