This guide provides a complete Ansible playbook to install Observium Community Edition with proper configuration for network monitoring, SNMP polling, and web interface.
Current Observium version: Community Edition (varies)
Create a file named observium.yml:
---
- name: Install and Configure Observium CE
hosts: observium
become: true
vars:
observium_version: "community"
observium_port: 80
mysql_root_password: "mysql_root_secure_password"
observium_db_password: "observium_db_password"
observium_admin_password: "admin_123" # Change this!
observium_dir: "/opt/observium"
observium_user: "observium"
tasks:
- name: Install prerequisites (Debian/Ubuntu)
apt:
name:
- mariadb-server
- mariadb-client
- python3-pymysql
- php
- php-mysql
- php-gd
- php-snmp
- php-curl
- php-mbstring
- php-xml
- php-json
- php-zip
- snmp
- snmpd
- libsnmp-dev
- librrd-dev
- rrdtool
- graphviz
- imagemagick
- fping
- git
- wget
- unzip
state: present
update_cache: true
when: ansible_os_family == "Debian"
- name: Install prerequisites (RHEL/CentOS)
yum:
name:
- mariadb-server
- mariadb
- python3-PyMySQL
- php
- php-mysqlnd
- php-gd
- php-snmp
- php-curl
- php-mbstring
- php-xml
- php-json
- php-zip
- net-snmp
- net-snmp-utils
- net-snmp-libs
- net-snmp-devel
- rrdtool
- rrdtool-devel
- graphviz
- ImageMagick
- fping
- git
- wget
- unzip
- gcc
state: present
when: ansible_os_family == "RedHat"
- name: Enable and start MariaDB/MySQL
systemd:
name: "{{ 'mariadb' if ansible_os_family == 'Debian' else 'mysqld' }}"
enabled: true
state: started
- name: Set MySQL root password
mysql_user:
name: root
password: "{{ mysql_root_password }}"
login_unix_socket: /var/run/mysqld/mysqld.sock
state: present
when: ansible_os_family == "Debian"
- name: Create Observium database
mysql_db:
name: observium
state: present
login_unix_socket: /var/run/mysqld/mysqld.sock
login_user: root
login_password: "{{ mysql_root_password }}"
- name: Create Observium database user
mysql_user:
name: observium
password: "{{ observium_db_password }}"
priv: "observium.*:ALL"
host: localhost
state: present
login_unix_socket: /var/run/mysqld/mysqld.sock
login_user: root
login_password: "{{ mysql_root_password }}"
- name: Create Observium user
user:
name: "{{ observium_user }}"
comment: "Observium User"
create_home: false
system: true
- name: Create Observium directory
file:
path: "{{ observium_dir }}"
state: directory
owner: "{{ observium_user }}"
group: "{{ observium_user }}"
mode: '0755'
- name: Download Observium Community Edition
get_url:
url: "https://dev.observium.org/git/observium/community/snapshot/observium-community-latest.tar.gz"
dest: "/tmp/observium.tar.gz"
mode: '0644'
register: download_result
- name: Extract Observium
unarchive:
src: /tmp/observium.tar.gz
dest: "{{ observium_dir }}"
remote_src: true
extra_opts: [--strip-components=1]
when: download_result.changed
- name: Set ownership on Observium directory
file:
path: "{{ observium_dir }}"
owner: "{{ observium_user }}"
group: "{{ observium_user }}"
mode: '0755'
recurse: true
- name: Create Observium configuration
copy:
dest: "{{ observium_dir }}/config.php"
owner: "{{ observium_user }}"
group: "{{ observium_user }}"
mode: '0644'
content: |
<?php
// Observium Configuration
$config['db_host'] = 'localhost';
$config['db_name'] = 'observium';
$config['db_user'] = 'observium';
$config['db_pass'] = '{{ observium_db_password }}';
$config['db_port'] = 3306;
$config['db_socket'] = '';
$config['base_url'] = 'http://{{ ansible_default_ipv4.address | default(ansible_host) }}/';
$config['page_title_prefix'] = 'Observium - ';
$config['snmp']['community'] = 'public';
$config['snmp']['version'] = 'v2c';
$config['snmp']['timeout'] = 5;
$config['snmp']['retries'] = 3;
$config['poller_threads'] = 16;
$config['poller_frequency'] = 300;
$config['discovery_threads'] = 16;
$config['alert']['default_mail'] = 'admin@example.com';
$config['alert']['default_only'] = 0;
$config['fping'] = '/usr/sbin/fping';
$config['rrdtool'] = '/usr/bin/rrdtool';
$config['allow_unauth_graphs'] = false;
$config['allow_unauth_graphs_cidr'] = array();
$config['auth_mechanism'] = 'mysql';
$config['enable_billing'] = 1;
$config['enable_syslog'] = 1;
$config['enable_ports'] = 1;
$config['discovery_by_ip'] = 0;
- name: Run Observium installer
command: "{{ observium_dir }}/discovery.php -h new"
args:
chdir: "{{ observium_dir }}"
become_user: "{{ observium_user }}"
failed_when: false
- name: Create admin user
command: "{{ observium_dir }}/adduser.php admin {{ observium_admin_password }} admin admin@example.com"
args:
chdir: "{{ observium_dir }}"
become_user: "{{ observium_user }}"
register: admin_result
failed_when: false
- name: Configure Apache for Observium (Debian/Ubuntu)
copy:
dest: /etc/apache2/sites-available/observium.conf
owner: root
group: root
mode: '0644'
content: |
<VirtualHost *:{{ observium_port }}>
ServerName {{ ansible_fqdn | default(ansible_hostname) }}
DocumentRoot {{ observium_dir }}/html
<Directory {{ observium_dir }}/html>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/observium_error.log
CustomLog ${APACHE_LOG_DIR}/observium_access.log combined
</VirtualHost>
when: ansible_os_family == "Debian"
- name: Enable Observium site (Debian/Ubuntu)
command: a2ensite observium
args:
creates: /etc/apache2/sites-enabled/observium.conf
when: ansible_os_family == "Debian"
- name: Restart Apache (Debian/Ubuntu)
systemd:
name: apache2
enabled: true
state: restarted
when: ansible_os_family == "Debian"
- name: Configure firewall (UFW)
ufw:
rule: allow
port: "{{ observium_port }}"
proto: tcp
comment: "Observium web interface"
when: ansible_os_family == "Debian"
failed_when: false
- name: Configure firewall (firewalld)
firewalld:
service: "{{ item }}"
permanent: true
immediate: true
state: enabled
loop:
- http
- https
when: ansible_os_family == "RedHat"
failed_when: false
- name: Set up cron for Observium
copy:
dest: /etc/cron.d/observium
owner: root
group: root
mode: '0644'
content: |
# Observium Cron Jobs
1 */6 * * * {{ observium_user }} cd {{ observium_dir }} && ./discovery.php -h all >> /dev/null 2>&1
*/5 * * * * {{ observium_user }} cd {{ observium_dir }} && ./poller.php >> /dev/null 2>&1
1 0 * * * {{ observium_user }} cd {{ observium_dir }} && ./billers.php >> /dev/null 2>&1
5 */6 * * * {{ observium_user }} cd {{ observium_dir }} && ./syslog.php >> /dev/null 2>&1
1 0 * * 0 {{ observium_user }} cd {{ observium_dir }} && ./purge-billing-data.php >> /dev/null 2>&1
- name: Display Observium status
debug:
msg: |
Observium Community Edition installed successfully!
Web Interface: http://{{ ansible_default_ipv4.address | default(ansible_host) }}/
Username: admin
Password: {{ observium_admin_password }}
IMPORTANT: Change the default password after first login!
Installation directory: {{ observium_dir }}
Database: observium@localhost
---
observium:
hosts:
observium-server:
ansible_host: 192.168.1.122
ansible_user: ansible
ansible_become: true
# Test connectivity
ansible all -i inventory.yml -m ping
# Run the Observium playbook
ansible-playbook -i inventory.yml observium.yml
# Run with custom admin password
ansible-playbook -i inventory.yml observium.yml \
-e "observium_admin_password=MySecureP@ss123"
# Check cron jobs
ssh observium-server "cat /etc/cron.d/observium"
# Test web interface
curl -I http://observium-server/
# Access web UI
# http://observium-server/
- name: Add network devices to Observium
hosts: observium
become: true
vars:
observium_dir: "/opt/observium"
observium_user: "observium"
devices_to_monitor:
- ip: 192.168.1.1
community: public
version: v2c
- ip: 192.168.1.2
community: public
version: v2c
tasks:
- name: Add devices to Observium
command: "{{ observium_dir }}/add-device.php {{ item.ip }} -c {{ item.community }} -v {{ item.version }}"
args:
chdir: "{{ observium_dir }}"
become_user: "{{ observium_user }}"
loop: "{{ devices_to_monitor }}"
register: add_result
failed_when: false
- name: Display add results
debug:
var: add_result
- name: Configure SNMP settings for Observium
hosts: observium
become: true
vars:
observium_dir: "/opt/observium"
snmp_community: "private"
snmp_version: "v2c"
tasks:
- name: Update SNMP configuration
lineinfile:
path: "{{ observium_dir }}/config.php"
regexp: "^\\$config\\['snmp'"
line: "$config['snmp']['community'] = '{{ snmp_community }}';"
insertafter: EOF
- name: Run discovery for new settings
command: "{{ observium_dir }}/discovery.php -h all"
args:
chdir: "{{ observium_dir }}"
become_user: observium
failed_when: false
# Check poller logs
sudo tail -f /opt/observium/logs/poller.log
# Check discovery logs
sudo tail -f /opt/observium/logs/discovery.log
# Test SNMP connectivity
snmpwalk -v2c -c public 192.168.1.1
# Check database connection
mysql -u observium -pobservium_db_password -e "SELECT 1"
# Check database size
mysql -u observium -p -D observium -e "SELECT table_name, table_rows FROM information_schema.tables WHERE table_schema = 'observium'"
# Check Apache logs
sudo tail -f /var/log/apache2/observium_error.log
# Check PHP errors
sudo tail -f /var/log/php_errors.log
# Verify permissions
sudo ls -la /opt/observium/html/
We develop tailored automation solutions for:
Let’s discuss your requirements: office@linux-server-admin.com | Contact