This guide provides a complete Ansible playbook to install Glances from pip or packages with proper configuration for web server mode, REST API, and monitoring.
Current Glances version: 4.1.0
Create a file named glances.yml:
---
- name: Install and Configure Glances
hosts: glances
become: true
vars:
glances_version: "4.1.0"
glances_port: 61208
glances_username: "glances"
glances_password: "glances123" # Change this!
glances_config_dir: "/etc/glances"
glances_mode: "web" # Options: web, server, standalone
tasks:
- name: Install Python pip (Debian/Ubuntu)
apt:
name:
- python3-pip
- python3-venv
- python3-dev
- libjpeg-dev
- zlib1g-dev
state: present
update_cache: true
when: ansible_os_family == "Debian"
- name: Install Python pip (RHEL/CentOS)
yum:
name:
- python3-pip
- python3-devel
- libjpeg-turbo-devel
- zlib-devel
state: present
when: ansible_os_family == "RedHat"
- name: Create Glances user
user:
name: "{{ glances_username }}"
system: true
shell: /usr/sbin/nologin
create_home: false
- name: Create Glances virtual environment
command: python3 -m venv /opt/glances
args:
creates: /opt/glances/bin/python
- name: Install Glances via pip
pip:
name:
- "glances=={{ glances_version }}"
- bottle
virtualenv: /opt/glances
state: present
- name: Create Glances configuration directory
file:
path: "{{ glances_config_dir }}"
state: directory
owner: "{{ glances_username }}"
group: "{{ glances_username }}"
mode: '0755'
- name: Create Glances configuration file
copy:
dest: "{{ glances_config_dir }}/glances.conf"
owner: "{{ glances_username }}"
group: "{{ glances_username }}"
mode: '0644'
content: |
[quicklook]
disable_cpu=False
disable_memory=False
disable_disk=False
disable_network=False
disable_load=False
[webserver]
port={{ glances_port }}
username={{ glances_username }}
password={{ glances_password }}
[server]
port={{ glances_port }}
bind_address=0.0.0.0
[outputs]
# Enable CSV export (optional)
# csv_export_dir=/var/log/glances
- name: Create Glances systemd service
copy:
dest: /etc/systemd/system/glances.service
owner: root
group: root
mode: '0644'
content: |
[Unit]
Description=Glances Monitoring
After=network.target
[Service]
Type=simple
User={{ glances_username }}
Group={{ glances_username }}
ExecStart=/opt/glances/bin/glances -w -p {{ glances_port }} --config {{ glances_config_dir }}/glances.conf
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
- name: Reload systemd daemon
systemd:
daemon_reload: true
- name: Enable and start Glances service
systemd:
name: glances
enabled: true
state: started
daemon_reload: true
- name: Wait for Glances to start
wait_for:
port: "{{ glances_port }}"
delay: 3
timeout: 60
- name: Configure firewall (UFW)
ufw:
rule: allow
port: "{{ glances_port }}"
proto: tcp
comment: "Glances web interface"
when: ansible_os_family == "Debian"
failed_when: false
- name: Configure firewall (firewalld)
firewalld:
port: "{{ glances_port }}/tcp"
permanent: true
immediate: true
state: enabled
when: ansible_os_family == "RedHat"
failed_when: false
- name: Verify Glances is running
uri:
url: "http://localhost:{{ glances_port }}/api/3/health"
method: GET
status_code: 200
register: health_check
retries: 3
delay: 2
until: health_check.status == 200
- name: Display Glances status
debug:
msg: |
Glances {{ glances_version }} installed successfully!
Web Interface: http://{{ ansible_default_ipv4.address | default(ansible_host) }}:{{ glances_port }}
Username: {{ glances_username }}
Password: {{ glances_password }}
IMPORTANT: Change the default password after first login!
Configuration directory: {{ glances_config_dir }}
---
glances:
hosts:
glances-server:
ansible_host: 192.168.1.111
ansible_user: ansible
ansible_become: true
# Test connectivity
ansible all -i inventory.yml -m ping
# Run the Glances playbook
ansible-playbook -i inventory.yml glances.yml
# Run with custom credentials
ansible-playbook -i inventory.yml glances.yml \
-e "glances_username=admin" \
-e "glances_password=SecureP@ss123"
# Check service status
ssh glances-server "sudo systemctl status glances"
# Test API health
curl http://glances-server:61208/api/3/health
# Access web UI
# http://glances-server:61208
- name: Configure Glances in server mode
hosts: glances_servers
become: true
vars:
glances_port: 61209
tasks:
- name: Install Glances
pip:
name: glances
state: present
- name: Create Glances server service
copy:
dest: /etc/systemd/system/glances-server.service
content: |
[Unit]
Description=Glances Server
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/glances -s -p {{ glances_port }} -B 0.0.0.0
Restart=on-failure
[Install]
WantedBy=multi-user.target
- name: Enable and start Glances server
systemd:
name: glances-server
enabled: true
state: started
daemon_reload: true
- name: Configure Glances client mode
hosts: glances_clients
become: true
vars:
glances_server: "192.168.1.111"
glances_port: 61209
tasks:
- name: Install Glances
pip:
name: glances
state: present
- name: Create Glances client service
copy:
dest: /etc/systemd/system/glances-client.service
content: |
[Unit]
Description=Glances Client
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/glances -c {{ glances_server }} -p {{ glances_port }}
Restart=on-failure
[Install]
WantedBy=multi-user.target
- name: Configure Glances plugins
hosts: glances
become: true
tasks:
- name: Update Glances configuration with plugins
copy:
dest: "{{ glances_config_dir }}/glances.conf"
owner: "{{ glances_username }}"
group: "{{ glances_username }}"
mode: '0644'
content: |
[quicklook]
disable_cpu=False
disable_memory=False
disable_disk=False
disable_network=False
disable_load=False
disable_process=True
[cpu]
log=False
disable_core=False
disable_freq=False
disable_stats=False
disable_top_extend=False
[memory]
log=False
[disk]
log=False
disable_diskio=False
disable_fs=False
disable_folders=False
[network]
log=False
disable_netstats=False
disable_networks=False
[process]
log=False
disable_processlist=False
disable_quicklook=False
[webserver]
port=61208
username=glances
password=glances123
ssl=False
[outputs]
# Enable InfluxDB output (optional)
# influxdb_host=localhost
# influxdb_port=8086
# influxdb_db=glances
# Enable Prometheus output (optional)
# prometheus_port=9091
- name: Enable Docker monitoring in Glances
hosts: glances
become: true
tasks:
- name: Install Docker Python library
pip:
name: docker
state: present
- name: Add Glances user to Docker group
user:
name: "{{ glances_username }}"
groups: docker
append: true
- name: Enable Docker plugin in config
lineinfile:
path: "{{ glances_config_dir }}/glances.conf"
regexp: "^#?\s*\[docker\]"
line: "[docker]\ndisable_container=False"
insertafter: EOF
- name: Restart Glances
systemd:
name: glances
state: restarted
- name: Configure Glances Prometheus exporter
hosts: glances
become: true
vars:
prometheus_port: 9091
tasks:
- name: Update Glances config for Prometheus
lineinfile:
path: "{{ glances_config_dir }}/glances.conf"
regexp: "^#?\s*prometheus_port"
line: "prometheus_port={{ prometheus_port }}"
insertafter: \[outputs\]
- name: Create Prometheus exporter service
copy:
dest: /etc/systemd/system/glances-prometheus.service
content: |
[Unit]
Description=Glances Prometheus Exporter
After=network.target
[Service]
Type=simple
ExecStart=/opt/glances/bin/glances --prometheus --prometheus-port {{ prometheus_port }}
Restart=on-failure
[Install]
WantedBy=multi-user.target
- name: Enable and start Prometheus exporter
systemd:
name: glances-prometheus
enabled: true
state: started
daemon_reload: true
- name: Configure firewall for Prometheus
firewalld:
port: "{{ prometheus_port }}/tcp"
permanent: true
immediate: true
state: enabled
failed_when: false
# Check logs
sudo journalctl -u glances -f
# Check Glances logs
sudo tail -f /var/log/glances/glances.log
# Test configuration
sudo -u glances /opt/glances/bin/glances --config /etc/glances/glances.conf
# Check what's using the port
sudo netstat -tlnp | grep 61208
# Change port in configuration
sudo nano /etc/glances/glances.conf
# Reduce refresh rate
sudo nano /etc/glances/glances.conf
# Add: refresh=10 (default is 2)
# Disable heavy plugins
sudo nano /etc/glances/glances.conf
# Add: disable_processlist=True
# Check Docker group membership
groups glances
# Test Docker access
sudo -u glances docker ps
# Restart service after group change
sudo systemctl restart glances
We develop tailored automation solutions for:
Let’s discuss your requirements: office@linux-server-admin.com | Contact