diff --git a/roles/collectd/defaults/main.yml b/roles/collectd/defaults/main.yml
new file mode 100644
index 0000000..f0f0c94
--- /dev/null
+++ b/roles/collectd/defaults/main.yml
@@ -0,0 +1,2 @@
+---
+# defaults file for collectd
diff --git a/roles/collectd/files/types.db b/roles/collectd/files/types.db
new file mode 100644
index 0000000..c41c22e
--- /dev/null
+++ b/roles/collectd/files/types.db
@@ -0,0 +1,316 @@
+absolute value:ABSOLUTE:0:U
+apache_bytes value:DERIVE:0:U
+apache_connections value:GAUGE:0:65535
+apache_idle_workers value:GAUGE:0:65535
+apache_requests value:DERIVE:0:U
+apache_scoreboard value:GAUGE:0:65535
+ath_nodes value:GAUGE:0:65535
+ath_stat value:DERIVE:0:U
+backends value:GAUGE:0:65535
+bad_peb_count value:COUNTER:0:U
+bitrate value:GAUGE:0:4294967295
+blocked_clients value:GAUGE:0:U
+bool value:GAUGE:0:1
+bucket value:GAUGE:0:U
+buffer value:GAUGE:0:18446744073709551615
+bytes value:GAUGE:0:U
+cache_eviction value:DERIVE:0:U
+cache_operation value:DERIVE:0:U
+cache_ratio value:GAUGE:0:100
+cache_result value:DERIVE:0:U
+cache_size value:GAUGE:0:1125899906842623
+capacity value:GAUGE:0:U
+ceph_bytes value:GAUGE:U:U
+ceph_latency value:GAUGE:U:U
+ceph_rate value:DERIVE:0:U
+changes_since_last_save value:GAUGE:0:U
+charge value:GAUGE:0:U
+clock_last_meas value:GAUGE:0:U
+clock_last_update value:GAUGE:U:U
+clock_mode value:GAUGE:0:U
+clock_reachability value:GAUGE:0:U
+clock_skew_ppm value:GAUGE:0:1000000
+clock_state value:GAUGE:0:U
+clock_stratum value:GAUGE:0:U
+compression uncompressed:DERIVE:0:U, compressed:DERIVE:0:U
+compression_ratio value:GAUGE:0:2
+commands value:DERIVE:0:U
+connections value:DERIVE:0:U
+conntrack value:GAUGE:0:4294967295
+contextswitch value:DERIVE:0:U
+controller value:GAUGE:0:18446744073709551615
+cookies value:DERIVE:0:U
+count value:GAUGE:0:U
+counter value:COUNTER:U:U
+cpu value:DERIVE:0:U
+cpu_affinity value:GAUGE:0:1
+cpufreq value:GAUGE:0:U
+current value:GAUGE:U:U
+current_connections value:GAUGE:0:U
+current_sessions value:GAUGE:0:U
+delay value:GAUGE:-1000000:1000000
+delay_rate value:GAUGE:0:U
+derive value:DERIVE:0:U
+df used:GAUGE:0:1125899906842623, free:GAUGE:0:1125899906842623
+df_complex value:GAUGE:0:U
+df_inodes value:GAUGE:0:U
+dilution_of_precision value:GAUGE:0:U
+disk_allocation value:GAUGE:0:U
+disk_capacity value:GAUGE:0:U
+disk_error value:GAUGE:0:U
+disk_io_time io_time:DERIVE:0:U, weighted_io_time:DERIVE:0:U
+disk_latency read:GAUGE:0:U, write:GAUGE:0:U
+disk_merged read:DERIVE:0:U, write:DERIVE:0:U
+disk_octets read:DERIVE:0:U, write:DERIVE:0:U
+disk_ops read:DERIVE:0:U, write:DERIVE:0:U
+disk_ops_complex value:DERIVE:0:U
+disk_physical value:GAUGE:0:U
+disk_time read:DERIVE:0:U, write:DERIVE:0:U
+dns_answer value:DERIVE:0:U
+dns_notify value:DERIVE:0:U
+dns_octets queries:DERIVE:0:U, responses:DERIVE:0:U
+dns_opcode value:DERIVE:0:U
+dns_qtype value:DERIVE:0:U
+dns_qtype_cached value:GAUGE:0:4294967295
+dns_query value:DERIVE:0:U
+dns_question value:DERIVE:0:U
+dns_rcode value:DERIVE:0:U
+dns_reject value:DERIVE:0:U
+dns_request value:DERIVE:0:U
+dns_resolver value:DERIVE:0:U
+dns_response value:DERIVE:0:U
+dns_transfer value:DERIVE:0:U
+dns_update value:DERIVE:0:U
+dns_zops value:DERIVE:0:U
+domain_state state:GAUGE:0:U, reason:GAUGE:0:U
+dpdk_telemetry value:COUNTER:0:U
+drbd_resource value:DERIVE:0:U
+duration seconds:GAUGE:0:U
+email_check value:GAUGE:0:U
+email_count value:GAUGE:0:U
+email_size value:GAUGE:0:U
+energy value:GAUGE:U:U
+energy_wh value:GAUGE:U:U
+entropy value:GAUGE:0:4294967295
+errors value:DERIVE:0:U
+evicted_keys value:DERIVE:0:U
+expired_keys value:DERIVE:0:U
+fanspeed value:GAUGE:0:U
+file_handles value:GAUGE:0:U
+file_size value:GAUGE:0:U
+files value:GAUGE:0:U
+filter_result value:DERIVE:0:U
+flow value:GAUGE:0:U
+fork_rate value:DERIVE:0:U
+freepages value:GAUGE:0:U
+frequency value:GAUGE:0:U
+frequency_error value:GAUGE:-1000000:1000000
+frequency_offset value:GAUGE:-1000000:1000000
+fscache_stat value:DERIVE:0:U
+gauge value:GAUGE:U:U
+hash_collisions value:DERIVE:0:U
+health value:GAUGE:0:18446744073709551615
+http_request_methods value:DERIVE:0:U
+http_requests value:DERIVE:0:U
+http_response_codes value:DERIVE:0:U
+humidity value:GAUGE:0:100
+if_collisions value:DERIVE:0:U
+if_dropped rx:DERIVE:0:U, tx:DERIVE:0:U
+if_errors rx:DERIVE:0:U, tx:DERIVE:0:U
+if_multicast value:DERIVE:0:U
+if_octets rx:DERIVE:0:U, tx:DERIVE:0:U
+if_packets rx:DERIVE:0:U, tx:DERIVE:0:U
+if_rx_dropped value:DERIVE:0:U
+if_rx_errors value:DERIVE:0:U
+if_rx_nohandler value:DERIVE:0:U
+if_rx_octets value:DERIVE:0:U
+if_rx_packets value:DERIVE:0:U
+if_tx_dropped value:DERIVE:0:U
+if_tx_errors value:DERIVE:0:U
+if_tx_octets value:DERIVE:0:U
+if_tx_packets value:DERIVE:0:U
+invocations value:DERIVE:0:U
+io_octets rx:DERIVE:0:U, tx:DERIVE:0:U
+io_ops read:DERIVE:0:U, write:DERIVE:0:U
+io_packets rx:DERIVE:0:U, tx:DERIVE:0:U
+ipc value:GAUGE:0:U
+ipt_bytes value:DERIVE:0:U
+ipt_packets value:DERIVE:0:U
+irq value:DERIVE:0:U
+job_stats value:DERIVE:0:U
+latency value:GAUGE:0:U
+links value:GAUGE:0:U
+load shortterm:GAUGE:0:5000, midterm:GAUGE:0:5000, longterm:GAUGE:0:5000
+max_ec value:COUNTER:0:U
+media value:GAUGE:0:18446744073709551615
+memory_bandwidth value:DERIVE:0:U
+md_disks value:GAUGE:0:U
+memcached_command value:DERIVE:0:U
+memcached_connections value:GAUGE:0:U
+memcached_items value:GAUGE:0:U
+memcached_octets rx:DERIVE:0:U, tx:DERIVE:0:U
+memcached_ops value:DERIVE:0:U
+memory value:GAUGE:0:281474976710656
+memory_lua value:GAUGE:0:281474976710656
+memory_throttle_count value:DERIVE:0:U
+multimeter value:GAUGE:U:U
+mutex_operations value:DERIVE:0:U
+mysql_bpool_bytes value:GAUGE:0:U
+mysql_bpool_counters value:DERIVE:0:U
+mysql_bpool_pages value:GAUGE:0:U
+mysql_commands value:DERIVE:0:U
+mysql_handler value:DERIVE:0:U
+mysql_innodb_data value:DERIVE:0:U
+mysql_innodb_dblwr value:DERIVE:0:U
+mysql_innodb_log value:DERIVE:0:U
+mysql_innodb_pages value:DERIVE:0:U
+mysql_innodb_row_lock value:DERIVE:0:U
+mysql_innodb_rows value:DERIVE:0:U
+mysql_locks value:DERIVE:0:U
+mysql_log_position value:DERIVE:0:U
+mysql_octets rx:DERIVE:0:U, tx:DERIVE:0:U
+mysql_select value:DERIVE:0:U
+mysql_sort value:DERIVE:0:U
+mysql_sort_merge_passes value:DERIVE:0:U
+mysql_sort_rows value:DERIVE:0:U
+mysql_slow_queries value:DERIVE:0:U
+nfs_procedure value:DERIVE:0:U
+nginx_connections value:GAUGE:0:U
+nginx_requests value:DERIVE:0:U
+node_octets rx:DERIVE:0:U, tx:DERIVE:0:U
+node_rssi value:GAUGE:0:255
+node_stat value:DERIVE:0:U
+node_tx_rate value:GAUGE:0:127
+objects value:GAUGE:0:U
+operations value:DERIVE:0:U
+operations_per_second value:GAUGE:0:U
+packets value:DERIVE:0:U
+pending_operations value:GAUGE:0:U
+percent value:GAUGE:0:100.1
+percent_bytes value:GAUGE:0:100.1
+percent_inodes value:GAUGE:0:100.1
+perf value:DERIVE:0:U
+pf_counters value:DERIVE:0:U
+pf_limits value:DERIVE:0:U
+pf_source value:DERIVE:0:U
+pf_state value:DERIVE:0:U
+pf_states value:GAUGE:0:U
+pg_blks value:DERIVE:0:U
+pg_db_size value:GAUGE:0:U
+pg_n_tup_c value:DERIVE:0:U
+pg_n_tup_g value:GAUGE:0:U
+pg_numbackends value:GAUGE:0:U
+pg_scan value:DERIVE:0:U
+pg_xact value:DERIVE:0:U
+ping value:GAUGE:0:65535
+ping_droprate value:GAUGE:0:1
+ping_stddev value:GAUGE:0:65535
+players value:GAUGE:0:1000000
+pools value:GAUGE:0:U
+power value:GAUGE:U:U
+pressure value:GAUGE:0:U
+protocol_counter value:DERIVE:0:U
+ps_code value:GAUGE:0:9223372036854775807
+ps_count processes:GAUGE:0:1000000, threads:GAUGE:0:1000000
+ps_cputime user:DERIVE:0:U, syst:DERIVE:0:U
+ps_data value:GAUGE:0:9223372036854775807
+ps_disk_octets read:DERIVE:0:U, write:DERIVE:0:U
+ps_disk_ops read:DERIVE:0:U, write:DERIVE:0:U
+ps_pagefaults minflt:DERIVE:0:U, majflt:DERIVE:0:U
+ps_rss value:GAUGE:0:9223372036854775807
+ps_stacksize value:GAUGE:0:9223372036854775807
+ps_state value:GAUGE:0:65535
+ps_vm value:GAUGE:0:9223372036854775807
+pstates_enabled value:GAUGE:0:1
+pubsub value:GAUGE:0:U
+queue_length value:GAUGE:0:U
+records value:GAUGE:0:U
+redis_command_cputime value:DERIVE:0:U
+requests value:GAUGE:0:U
+response_code value:GAUGE:0:U
+response_time value:GAUGE:0:U
+root_delay value:GAUGE:U:U
+root_dispersion value:GAUGE:U:U
+route_etx value:GAUGE:0:U
+route_metric value:GAUGE:0:U
+routes value:GAUGE:0:U
+satellites value:GAUGE:0:U
+segments value:GAUGE:0:65535
+serial_octets rx:DERIVE:0:U, tx:DERIVE:0:U
+signal_noise value:GAUGE:U:0
+signal_power value:GAUGE:U:0
+signal_quality value:GAUGE:0:U
+slurm_job_state value:GAUGE:0:U
+slurm_node_state value:GAUGE:0:U
+slurm_backfilled_jobs value:DERIVE:0:U
+slurm_cycles value:DERIVE:0:U
+slurm_cycle_last value:GAUGE:0:U
+slurm_cycle_duration value:DERIVE:0:U
+slurm_last_cycle_depth value:GAUGE:0:U
+slurm_cycle_depth value:DERIVE:0:U
+slurm_job_stats value:DERIVE:0:U
+slurm_queue_length value:DERIVE:0:U
+smart_attribute current:GAUGE:0:255, worst:GAUGE:0:255, threshold:GAUGE:0:255, pretty:GAUGE:0:U
+smart_badsectors value:GAUGE:0:U
+smart_powercycles value:GAUGE:0:U
+smart_poweron value:GAUGE:0:U
+smart_temperature value:GAUGE:-300:300
+snr value:GAUGE:0:U
+spam_check value:GAUGE:0:U
+spam_score value:GAUGE:U:U
+spl value:GAUGE:U:U
+swap value:GAUGE:0:1099511627776
+swap_io value:DERIVE:0:U
+sysevent value:GAUGE:0:1
+tcp_connections value:GAUGE:0:4294967295
+tdp value:GAUGE:U:U
+temperature value:GAUGE:U:U
+threads value:GAUGE:0:U
+time_dispersion value:GAUGE:-1000000:1000000
+time_offset value:GAUGE:-1000000:1000000
+time_offset_ntp value:GAUGE:-1000000:1000000
+time_offset_rms value:GAUGE:-1000000:1000000
+time_ref value:GAUGE:0:U
+timeleft value:GAUGE:0:U
+timestamp value:GAUGE:0:18446744073709551615
+total_bytes value:DERIVE:0:U
+total_connections value:DERIVE:0:U
+total_events value:DERIVE:0:U
+total_objects value:DERIVE:0:U
+total_operations value:DERIVE:0:U
+total_requests value:DERIVE:0:U
+total_sessions value:DERIVE:0:U
+total_threads value:DERIVE:0:U
+total_time_in_ms value:DERIVE:0:U
+total_values value:DERIVE:0:U
+turbo_enabled value:GAUGE:0:1
+transitions value:DERIVE:0:U
+uptime value:GAUGE:0:4294967295
+uncore_ratio value:GAUGE:0:U
+users value:GAUGE:0:65535
+vcl value:GAUGE:0:65535
+vcpu value:GAUGE:0:U
+virt_cpu_total value:DERIVE:0:U
+virt_vcpu value:DERIVE:0:U
+vmpage_action value:DERIVE:0:U
+vmpage_faults minflt:DERIVE:0:U, majflt:DERIVE:0:U
+vmpage_io in:DERIVE:0:U, out:DERIVE:0:U
+vmpage_number value:GAUGE:0:4294967295
+volatile_changes value:GAUGE:0:U
+voltage value:GAUGE:U:U
+voltage_threshold value:GAUGE:U:U, threshold:GAUGE:U:U
+vs_memory value:GAUGE:0:9223372036854775807
+vs_processes value:GAUGE:0:65535
+vs_threads value:GAUGE:0:65535
+
+#
+# Legacy types
+# (required for the v5 upgrade target)
+#
+arc_counts demand_data:COUNTER:0:U, demand_metadata:COUNTER:0:U, prefetch_data:COUNTER:0:U, prefetch_metadata:COUNTER:0:U
+arc_l2_bytes read:COUNTER:0:U, write:COUNTER:0:U
+arc_l2_size value:GAUGE:0:U
+arc_ratio value:GAUGE:0:U
+arc_size current:GAUGE:0:U, target:GAUGE:0:U, minlimit:GAUGE:0:U, maxlimit:GAUGE:0:U
+mysql_qcache hits:COUNTER:0:U, inserts:COUNTER:0:U, not_cached:COUNTER:0:U, lowmem_prunes:COUNTER:0:U, queries_in_cache:GAUGE:0:U
+mysql_threads running:GAUGE:0:U, connected:GAUGE:0:U, cached:GAUGE:0:U, created:COUNTER:0:U
diff --git a/roles/collectd/handlers/main.yml b/roles/collectd/handlers/main.yml
new file mode 100644
index 0000000..1ea0d8c
--- /dev/null
+++ b/roles/collectd/handlers/main.yml
@@ -0,0 +1,6 @@
+---
+# handlers file for collectd
+- name: Restart collectd
+ systemd:
+ name: collectd
+ state: restarted
diff --git a/roles/collectd/molecule/default/INSTALL.rst b/roles/collectd/molecule/default/INSTALL.rst
new file mode 100644
index 0000000..0c4bf5c
--- /dev/null
+++ b/roles/collectd/molecule/default/INSTALL.rst
@@ -0,0 +1,23 @@
+*********************************
+Vagrant driver installation guide
+*********************************
+
+Requirements
+============
+
+* Vagrant
+* Virtualbox, Parallels, VMware Fusion, VMware Workstation or VMware Desktop
+
+Install
+=======
+
+Please refer to the `Virtual environment`_ documentation for installation best
+practices. If not using a virtual environment, please consider passing the
+widely recommended `'--user' flag`_ when invoking ``pip``.
+
+.. _Virtual environment: https://virtualenv.pypa.io/en/latest/
+.. _'--user' flag: https://packaging.python.org/tutorials/installing-packages/#installing-to-the-user-site
+
+.. code-block:: bash
+
+ $ pip install 'molecule_vagrant'
diff --git a/roles/collectd/molecule/default/converge.yml b/roles/collectd/molecule/default/converge.yml
new file mode 100644
index 0000000..899e6ab
--- /dev/null
+++ b/roles/collectd/molecule/default/converge.yml
@@ -0,0 +1,20 @@
+---
+- name: Converge
+ become: yes
+ hosts: all
+ vars:
+ - collectd_network_server: testvagrant
+ - collectd_network_server: 192.168.2.240
+ - collectd_network_port: 25826
+
+ pre_tasks:
+ - name: Update apt cache
+ apt:
+ update_cache: yes
+ - name: set hostname
+ hostname:
+ name: vagrantcollectd
+ tasks:
+ - name: "Include collectd"
+ include_role:
+ name: "collectd"
diff --git a/roles/collectd/molecule/default/molecule.yml b/roles/collectd/molecule/default/molecule.yml
new file mode 100644
index 0000000..d5eed35
--- /dev/null
+++ b/roles/collectd/molecule/default/molecule.yml
@@ -0,0 +1,19 @@
+---
+dependency:
+ name: galaxy
+driver:
+ name: vagrant
+ provider:
+ name: virtualbox
+platforms:
+ - name: Debian
+ box: "debian/bullseye64"
+ pre_build_image: true
+
+provisioner:
+ name: ansible
+verifier:
+ name: testinfra
+ options:
+ sudo: true
+ v: 3
diff --git a/roles/collectd/molecule/default/tests/conftest.py b/roles/collectd/molecule/default/tests/conftest.py
new file mode 100644
index 0000000..f7ddb3f
--- /dev/null
+++ b/roles/collectd/molecule/default/tests/conftest.py
@@ -0,0 +1,22 @@
+"""PyTest Fixtures."""
+from __future__ import absolute_import
+
+import os
+
+import pytest
+
+
+def pytest_runtest_setup(item):
+ """Run tests only when under molecule with testinfra installed."""
+ try:
+ import testinfra
+ except ImportError:
+ pytest.skip("Test requires testinfra", allow_module_level=True)
+ if "MOLECULE_INVENTORY_FILE" in os.environ:
+ pytest.testinfra_hosts = testinfra.utils.ansible_runner.AnsibleRunner(
+ os.environ["MOLECULE_INVENTORY_FILE"]
+ ).get_hosts("all")
+ else:
+ pytest.skip(
+ "Test should run only from inside molecule.", allow_module_level=True
+ )
diff --git a/roles/collectd/molecule/default/tests/test_default.py b/roles/collectd/molecule/default/tests/test_default.py
new file mode 100644
index 0000000..ab1ec49
--- /dev/null
+++ b/roles/collectd/molecule/default/tests/test_default.py
@@ -0,0 +1,18 @@
+"""Role testing files using testinfra."""
+import pytest
+
+def test_installed_packages(host):
+ collectd = host.package("collectd-core")
+ assert collectd.is_installed
+
+def test_config(host):
+ collectd_config = host.file("/etc/collectd/collectd.conf")
+ assert collectd_config.exists
+
+ dtypes = host.file("/usr/share/collectd/types.db")
+ assert dtypes.exists
+
+def test_service(host):
+ collectd = host.service("collectd")
+ assert collectd.is_enabled
+ assert collectd.is_running
diff --git a/roles/collectd/molecule/default/verify.yml b/roles/collectd/molecule/default/verify.yml
new file mode 100644
index 0000000..79044cd
--- /dev/null
+++ b/roles/collectd/molecule/default/verify.yml
@@ -0,0 +1,10 @@
+---
+# This is an example playbook to execute Ansible tests.
+
+- name: Verify
+ hosts: all
+ gather_facts: false
+ tasks:
+ - name: Example assertion
+ assert:
+ that: true
diff --git a/roles/collectd/tasks/main.yml b/roles/collectd/tasks/main.yml
new file mode 100644
index 0000000..fe37c79
--- /dev/null
+++ b/roles/collectd/tasks/main.yml
@@ -0,0 +1,30 @@
+---
+# tasks file for collectd
+
+- name: Install collectd
+ apt:
+ name: collectd-core
+ state: present
+
+- name: Make config dir
+ file:
+ path: "/etc/collectd/"
+ state: directory
+
+- name: Copy dtypes.db
+ copy:
+ src: types.db
+ dest: /usr/share/collectd/types.db
+
+- name: Feed config
+ template:
+ src: collectd.conf.j2
+ dest: /etc/collectd/collectd.conf
+ mode: 644
+ notify:
+ - Restart collectd
+
+- name: Enable collectd service
+ systemd:
+ name: "collectd.service"
+ enabled: yes
diff --git a/roles/collectd/templates/collectd.conf.j2 b/roles/collectd/templates/collectd.conf.j2
new file mode 100644
index 0000000..7582176
--- /dev/null
+++ b/roles/collectd/templates/collectd.conf.j2
@@ -0,0 +1,18 @@
+Hostname "{{ collectd_hostname | default(inventory_hostname) }}"
+TypesDB "/usr/share/collectd/types.db"
+
+LoadPlugin network
+
+ Server "{{ collectd_network_server }}" "{{ collectd_network_port }}"
+
+
+LoadPlugin cpu
+LoadPlugin load
+LoadPlugin memory
+
+LoadPlugin df
+
+ IgnoreSelected true
+
+
+
diff --git a/roles/collectd/tests/inventory b/roles/collectd/tests/inventory
new file mode 100644
index 0000000..878877b
--- /dev/null
+++ b/roles/collectd/tests/inventory
@@ -0,0 +1,2 @@
+localhost
+
diff --git a/roles/collectd/tests/test.yml b/roles/collectd/tests/test.yml
new file mode 100644
index 0000000..970b9fb
--- /dev/null
+++ b/roles/collectd/tests/test.yml
@@ -0,0 +1,5 @@
+---
+- hosts: localhost
+ remote_user: root
+ roles:
+ - collectd
diff --git a/roles/collectd/vars/main.yml b/roles/collectd/vars/main.yml
new file mode 100644
index 0000000..605df18
--- /dev/null
+++ b/roles/collectd/vars/main.yml
@@ -0,0 +1,2 @@
+---
+# vars file for collectd