diff --git a/docs/tutorials/iotlab.rst b/docs/tutorials/iotlab.rst
index 33f71dacec363a5a1193897bdf57c79ef68bbaff..5d8f8de88b6cec939912a24cd4221624b76eaba8 100644
--- a/docs/tutorials/iotlab.rst
+++ b/docs/tutorials/iotlab.rst
@@ -192,6 +192,7 @@ This script implements a similar behavior as the "Radio sniffer with M3 nodes"
         $ tar xfz <expid>-grenoble.iot-lab.info.tar.gz
         $ wireshark <expid>/sniffer/m3-7.pcap
 
+.. _IoT-LAB IPv6:
 
 IPv6 - Interacting with frontend
 --------------------------------
@@ -237,15 +238,8 @@ This example is based on the `Monitoring Service Class <../apidoc/service.html#m
 It installs the Granafa/InfluxDB to visualize/store the monitoring metrics, which are collected by
 Telegraf agents running on each node of the infrastructure.
 
-Unfortunately, we cannot use the available API to install the monitoring stack in FIT/IoT-LAB, since
-they depend on a debian/ubuntu base environment and docker containers which is not available in the nodes of
-this testbed.
-However, it is still possible to install the Telegraf agent in A8 nodes, and consequently,
-collect metrics about their resource utilization.
-
 In this scenario, a Grid'5000 node contains the collector(InfluxDB) and ui(Grafana).
-The telegraf agent is installed in both Grid'5000 and FIT/IoT-LAB nodes, but the installation on
-A8 nodes is done without using the standard "Monitoring Service Class".
+The telegraf agent is installed in both Grid'5000 and FIT/IoT-LAB nodes.
 
 Finally, to handle with the connectivity problem, because Grid'5000 and FIT/IoT-LAB are part of
 2 isolated networks, we need to run the openvpn client on A8 nodes. For that, it is necessary to
@@ -255,6 +249,12 @@ Note that the openvpn client is already available in A8 nodes and no installatio
 
 **Requirement**: Grid'5000 VPN files on shared folder (~/A8/).
 
+.. warning::
+    This tutorial assumes that the files Grid5000_VPN.ovpn, .crt, .key are located on the FIT frontend.
+    Moreover it also assumes that no passphrase is given to the private key.
+    You private key is very sensitive so you must protect it the best you can (chmod 600).
+    Prefer using IPv6 if you can: :ref:`IoT-LAB IPv6`
+
 .. literalinclude:: iotlab/tuto_iotlab_a8_monitoring.py
    :language: python
    :linenos:
diff --git a/docs/tutorials/iotlab/tuto_iotlab_a8_monitoring.py b/docs/tutorials/iotlab/tuto_iotlab_a8_monitoring.py
index 50d6ed573a5a41855ca80656a064fc478c26da47..e9740c2372d1d4bac72de94aee2238f0ca8973e5 100644
--- a/docs/tutorials/iotlab/tuto_iotlab_a8_monitoring.py
+++ b/docs/tutorials/iotlab/tuto_iotlab_a8_monitoring.py
@@ -6,35 +6,6 @@ import time
 
 logging.basicConfig(stream=sys.stdout, level=logging.INFO)
 
-def install_telegraf_a8_nodes(monit_obj, iotlab_nodes, pattern="a8", telegraf_version="telegraf-1.17.0"):
-    """ Installs and runs telegraf agent on A8 nodes.
-    A8 nodes are arm based. Tested with 1.17.0 version available at:
-    https://portal.influxdata.com/downloads/.
-
-    Adjust accordingly for your setup. Note that download links may change over time.
-    """
-    # write configuration file in A8 nodes using the Monitoring class
-    remote_telegraf_conf = monit_obj.write_agent_config(iotlab_nodes[pattern])
-    with play_on(
-        # a8 nodes share the same image, we only need to install telegraf once
-        pattern_hosts=iotlab_nodes[pattern][0].address, roles=iotlab_nodes
-    ) as p:
-        remote_dir = "/tmp/"
-        p.get_url(
-            url="https://dl.influxdata.com/telegraf/releases/" + telegraf_version + "_linux_armhf.tar.gz",
-            dest=remote_dir,
-            validate_certs=False,
-        )
-        p.shell("tar x -kzf " + remote_dir + telegraf_version + "_linux_armhf.tar.gz" + " -C /", creates="/" + telegraf_version)
-
-    # run telegraf on all hosts
-    with play_on(
-        pattern_hosts=pattern, roles=iotlab_nodes
-    ) as p:
-        # running telegraf daemon on async mode
-        p.shell("/" + telegraf_version + "/usr/bin/" + "telegraf --config " + remote_telegraf_conf, asynch=3600, poll=0)
-
-
 def setup_vpn(iotlab_roles, pattern="a8"):
     """ Initialize VPN on A8 nodes"""
     with play_on(
@@ -94,18 +65,15 @@ try:
     g5k_roles, g5k_networks = g5k_provider.init()
     g5k_roles = discover_networks(g5k_roles, g5k_networks)
 
+    print("Setting up VPN on A8 nodes to put them in the same network as Grid'5000")
+    setup_vpn(iotlab_roles)
+
     print("Deploy monitoring stack on Grid'5000")
     print("Install Grafana and InfluxDB at: %s" % str(g5k_roles["control"]))
     print("Install Telegraf at: %s" % str(g5k_roles["compute"]))
-    m = Monitoring(collector=g5k_roles["control"], agent=g5k_roles["compute"], ui=g5k_roles["control"])
+    m = Monitoring(collector=g5k_roles["control"], agent=g5k_roles["compute"]+iotlab_roles["a8"], ui=g5k_roles["control"])
     m.deploy()
 
-    print("Setting up VPN on A8 nodes to put them in the same network as Grid'5000")
-    setup_vpn(iotlab_roles)
-    print("A8 nodes don't support the regular instalation process used by Monitoring class")
-    print("Install Telegraf specific, bare-metal version for ARM processor")
-    install_telegraf_a8_nodes(m, iotlab_roles)
-
     ui_address = g5k_roles["control"][0].extra["my_network_ip"]
     print("The UI is available at http://%s:3000" % ui_address)
     print("user=admin, password=admin")
diff --git a/enoslib/service/monitoring/monitoring.py b/enoslib/service/monitoring/monitoring.py
index 316a838647db9d0345491b2f598b8e6ae341c5ee..cbbc1e51bcc35b6e5d1e5a657db3b610de85fa89 100644
--- a/enoslib/service/monitoring/monitoring.py
+++ b/enoslib/service/monitoring/monitoring.py
@@ -1,9 +1,8 @@
-import json
 from pathlib import Path
 import os
 from typing import Dict, List, Optional
 
-from enoslib.api import play_on, __python3__, __docker__
+from enoslib.api import play_on, run_ansible
 from enoslib.types import Host, Roles
 from ..service import Service
 from ..utils import _check_path, _to_abs
@@ -15,6 +14,8 @@ DEFAULT_COLLECTOR_ENV = {"INFLUXDB_HTTP_BIND_ADDRESS": ":8086"}
 
 DEFAULT_AGENT_IMAGE = "telegraf"
 
+SERVICE_PATH = os.path.abspath(os.path.dirname(os.path.realpath(__file__)))
+
 
 class Monitoring(Service):
     def __init__(
@@ -30,7 +31,7 @@ class Monitoring(Service):
         agent_env: Optional[Dict] = None,
         agent_image: str = DEFAULT_AGENT_IMAGE,
         ui_env: Optional[Dict] = None,
-        priors: List[play_on] = [__python3__, __docker__],
+        priors: List[play_on] = [],
         extra_vars: Dict = None,
     ):
         """Deploy a TIG stack: Telegraf, InfluxDB, Grafana.
@@ -96,9 +97,9 @@ class Monitoring(Service):
         # agent options
         self.agent_env = {} if not agent_env else agent_env
         if agent_conf is None:
-            self.agent_conf = Path("telegraf.conf.j2")
+            self.agent_conf = "telegraf.conf.j2"
         else:
-            self.agent_conf = _to_abs(Path(agent_conf))
+            self.agent_conf = str(_to_abs(Path(agent_conf)))
         self.agent_image = agent_image
 
         # ui options
@@ -113,63 +114,6 @@ class Monitoring(Service):
         self.extra_vars = {"ansible_python_interpreter": "/usr/bin/python3"}
         self.extra_vars.update(extra_vars)
 
-    def write_agent_config(self, agents: List[Host] = None) -> str:
-        """
-        Sets agent's telegraf config
-
-        Args:
-            agents: list of hosts to write telegraf's config
-        Returns:
-            config filename that will be created in agent's host
-        """
-        _path = os.path.abspath(os.path.dirname(os.path.realpath(__file__)))
-        extra_vars = {"collector_address": self._get_collector_address()}
-        extra_vars.update(self.extra_vars)
-        roles = self._roles
-        # user set a specific list of hosts
-        if agents is not None:
-            roles = {"agent": agents}
-        with play_on(
-            pattern_hosts="agent", roles=roles, extra_vars=extra_vars
-        ) as p:
-            p.file(path=self.remote_working_dir, state="directory")
-            p.template(
-                display_name="Generating the configuration file",
-                src=os.path.join(_path, self.agent_conf),
-                dest=self.remote_telegraf_conf,
-            )
-        return self.remote_telegraf_conf
-
-    def deploy_agent(self):
-        """Deploy telegraf agent
-
-        Generates telegraf config and start docker container
-        """
-        self.write_agent_config()
-        with play_on(
-            pattern_hosts="agent", roles=self._roles, extra_vars=self.extra_vars,
-        ) as p:
-
-            volumes = [
-                f"{self.remote_telegraf_conf}:/etc/telegraf/telegraf.conf",
-                "/sys:/rootfs/sys:ro",
-                "/proc:/rootfs/proc:ro",
-                "/var/run/docker.sock:/var/run/docker.sock:ro",
-            ]
-            env = {"HOST_PROC": "/rootfs/proc", "HOST_SYS": "/rootfs/sys"}
-            env.update(self.agent_env)
-            p.docker_container(
-                display_name="Installing Telegraf",
-                name="telegraf",
-                image=self.agent_image,
-                detach=True,
-                state="started",
-                recreate="yes",
-                network_mode="host",
-                volumes=volumes,
-                env=env,
-            )
-
     def _get_collector_address(self) -> str:
         """
         Auxiliary method to get collector's IP address
@@ -188,47 +132,7 @@ class Monitoring(Service):
         if self.collector is None:
             return
 
-        # Some requirements
-        with play_on(
-            pattern_hosts="all",
-            roles=self._roles,
-            priors=self.priors,
-            extra_vars=self.extra_vars,
-        ) as p:
-            p.pip(display_name="Installing python-docker", name="docker")
-
-        # Deploy the collector
-        # Handle port customisation
         _, collector_port = self.collector_env["INFLUXDB_HTTP_BIND_ADDRESS"].split(":")
-        with play_on(
-            pattern_hosts="collector", roles=self._roles, extra_vars=self.extra_vars
-        ) as p:
-            p.docker_container(
-                display_name="Installing",
-                name="influxdb",
-                image="influxdb",
-                detach=True,
-                network_mode="host",
-                state="started",
-                recreate="yes",
-                env=self.collector_env,
-                volumes=[f"{self.remote_influxdata}:/var/lib/influxdb"],
-            )
-            p.wait_for(
-                display_name="Waiting for InfluxDB to be ready",
-                # I don't have better solution yet
-                # The ci requirements are a bit annoying...
-                host="172.17.0.1",
-                port=collector_port,
-                state="started",
-                delay=2,
-                timeout=120,
-            )
-
-        # Deploy the agents
-        self.deploy_agent()
-
-        # Deploy the UI
         ui_address = None
         if self.network is not None:
             # This assumes that `discover_network` has been run before
@@ -237,85 +141,41 @@ class Monitoring(Service):
             # NOTE(msimonin): ping on docker bridge address for ci testing
             ui_address = "172.17.0.1"
 
-        # Handle port customisation
-        ui_port = self.ui_env["GF_SERVER_HTTP_PORT"]
-        with play_on(
-            pattern_hosts="ui", roles=self._roles, extra_vars=self.extra_vars
-        ) as p:
-            p.docker_container(
-                display_name="Installing Grafana",
-                name="grafana",
-                image="grafana/grafana",
-                detach=True,
-                network_mode="host",
-                env=self.ui_env,
-                recreate="yes",
-                state="started",
-            )
-            p.wait_for(
-                display_name="Waiting for grafana to be ready",
-                # NOTE(msimonin): ping on docker bridge address for ci testing
-                host=ui_address,
-                port=ui_port,
-                state="started",
-                delay=2,
-                timeout=120,
-            )
-            collector_url = f"http://{self._get_collector_address()}:{collector_port}"
-            p.uri(
-                display_name="Add InfluxDB in Grafana",
-                url=f"http://{ui_address}:{ui_port}/api/datasources",
-                user="admin",
-                password="admin",
-                force_basic_auth=True,
-                body_format="json",
-                method="POST",
-                # 409 means: already added
-                status_code=[200, 409],
-                body=json.dumps(
-                    {
-                        "name": "telegraf",
-                        "type": "influxdb",
-                        "url": collector_url,
-                        "access": "proxy",
-                        "database": "telegraf",
-                        "isDefault": True,
-                    }
-                ),
-            )
+        extra_vars = {
+            "enos_action": "deploy",
+            "collector_address": self._get_collector_address(),
+            "collector_port": collector_port,
+            "collector_env": self.collector_env,
+            "agent_conf": self.agent_conf,
+            "agent_image": self.agent_image,
+            "remote_working_dir": self.remote_working_dir,
+            "ui_address": ui_address,
+            "ui_port": self.ui_env["GF_SERVER_HTTP_PORT"],
+            "ui_env": self.ui_env
+        }
+        extra_vars.update(self.extra_vars)
+        _playbook = os.path.join(SERVICE_PATH, "monitoring.yml")
+        run_ansible(
+            self.priors + [_playbook], roles=self._roles, extra_vars=extra_vars
+        )
 
     def destroy(self):
         """Destroy the monitoring stack.
 
         This destroys all the container and associated volumes.
         """
-        with play_on(
-            pattern_hosts="ui", roles=self._roles, extra_vars=self.extra_vars
-        ) as p:
-            p.docker_container(
-                display_name="Destroying Grafana",
-                name="grafana",
-                state="absent",
-                force_kill=True,
-            )
-
-        with play_on(
-            pattern_hosts="agent", roles=self._roles, extra_vars=self.extra_vars
-        ) as p:
-            p.docker_container(
-                display_name="Destroying telegraf", name="telegraf", state="absent"
-            )
-
-        with play_on(
-            pattern_hosts="collector", roles=self._roles, extra_vars=self.extra_vars
-        ) as p:
-            p.docker_container(
-                display_name="Destroying InfluxDB",
-                name="influxdb",
-                state="absent",
-                force_kill=True,
-            )
-            p.file(path=f"{self.remote_influxdata}", state="absent")
+        extra_vars = {
+            "enos_action": "destroy",
+            "remote_working_dir": self.remote_working_dir,
+        }
+        extra_vars.update(self.extra_vars)
+        _playbook = os.path.join(SERVICE_PATH, "monitoring.yml")
+
+        run_ansible(
+            [_playbook],
+            roles=self._roles,
+            extra_vars=extra_vars
+        )
 
     def backup(self, backup_dir: Optional[str] = None):
         """Backup the monitoring stack.
@@ -330,29 +190,16 @@ class Monitoring(Service):
 
         _backup_dir = _check_path(_backup_dir)
 
-        with play_on(
-            pattern_hosts="collector", roles=self._roles, extra_vars=self.extra_vars
-        ) as p:
-            backup_path = os.path.join(self.remote_working_dir, "influxdb-data.tar.gz")
-            p.docker_container(
-                display_name="Stopping InfluxDB", name="influxdb", state="stopped"
-            )
-            p.archive(
-                display_name="Archiving the data volume",
-                path=f"{self.remote_influxdata}",
-                dest=backup_path,
-            )
-
-            p.fetch(
-                display_name="Fetching the data volume",
-                src=backup_path,
-                dest=str(Path(_backup_dir, "influxdb-data.tar.gz")),
-                flat=True,
-            )
-
-            p.docker_container(
-                display_name="Restarting InfluxDB",
-                name="influxdb",
-                state="started",
-                force_kill=True,
-            )
+        extra_vars = {
+            "enos_action": "backup",
+            "remote_working_dir": self.remote_working_dir,
+            "backup_dir": str(_backup_dir)
+        }
+        extra_vars.update(self.extra_vars)
+        _playbook = os.path.join(SERVICE_PATH, "monitoring.yml")
+
+        run_ansible(
+            [_playbook],
+            roles={"collector": self._roles["collector"]},
+            extra_vars=extra_vars
+        )
diff --git a/enoslib/service/monitoring/monitoring.yml b/enoslib/service/monitoring/monitoring.yml
new file mode 100644
index 0000000000000000000000000000000000000000..3bd43f1c7edc829ced0c10fe62a14b978f1dc9f3
--- /dev/null
+++ b/enoslib/service/monitoring/monitoring.yml
@@ -0,0 +1,24 @@
+---
+- name: Gather facts
+  hosts: all
+  tasks:
+  - name: Gather facts on all hosts
+    setup: {}
+
+- name: Monitoring - agents
+  hosts: agent
+  become: yes
+  roles:
+  - agent
+
+- name: Monitoring - collector
+  hosts: collector
+  become: yes
+  roles:
+  - collector
+
+- name: Monitoring - UI
+  hosts: ui
+  become: yes
+  roles:
+  - ui
diff --git a/enoslib/service/monitoring/roles/agent/defaults/main.yml b/enoslib/service/monitoring/roles/agent/defaults/main.yml
new file mode 100644
index 0000000000000000000000000000000000000000..3e114a35b85758266650139acf3125dca8ebdcd2
--- /dev/null
+++ b/enoslib/service/monitoring/roles/agent/defaults/main.yml
@@ -0,0 +1,2 @@
+telegraf_binary_version: telegraf-1.17.0
+telegraf_timeout: 31536000 # 1 year timeout
diff --git a/enoslib/service/monitoring/roles/agent/meta/main.yml b/enoslib/service/monitoring/roles/agent/meta/main.yml
new file mode 100644
index 0000000000000000000000000000000000000000..9af53afec1a4c8a882b35ab3547cc99d44278f0c
--- /dev/null
+++ b/enoslib/service/monitoring/roles/agent/meta/main.yml
@@ -0,0 +1,6 @@
+---
+dependencies:
+  - role: python3
+    when: ansible_architecture != "armv7l"
+  - role: docker
+    when: ansible_architecture != "armv7l"
diff --git a/enoslib/service/monitoring/roles/agent/tasks/binary.yml b/enoslib/service/monitoring/roles/agent/tasks/binary.yml
new file mode 100644
index 0000000000000000000000000000000000000000..ffce7b414697cf0535c4d3ceca9adb6760c672e9
--- /dev/null
+++ b/enoslib/service/monitoring/roles/agent/tasks/binary.yml
@@ -0,0 +1,15 @@
+---
+- name: Check that the telegraf binary already exists
+  stat:
+    path: /{{ telegraf_binary_version }}/usr/bin/telegraf 
+  register: stat_result
+
+- name: Installing telegraf binary
+  shell: "which telegraf || (curl -sfL https://dl.influxdata.com/telegraf/releases/{{ telegraf_binary_version }}_linux_armhf.tar.gz | tar x -zf - -C /)"
+  run_once: true
+  when: not stat_result.stat.exists
+
+- name: Running telegraf
+  shell: "/{{ telegraf_binary_version }}/usr/bin/telegraf --config {{ remote_working_dir }}/telegraf.conf"
+  async: "{{ telegraf_timeout }}"
+  poll: 0
\ No newline at end of file
diff --git a/enoslib/service/monitoring/roles/agent/tasks/config.yml b/enoslib/service/monitoring/roles/agent/tasks/config.yml
new file mode 100644
index 0000000000000000000000000000000000000000..3f25cfede736abce07c73fdc2b2eed65acf492d1
--- /dev/null
+++ b/enoslib/service/monitoring/roles/agent/tasks/config.yml
@@ -0,0 +1,10 @@
+---
+- name: "Creating remote directory"
+  file:
+    path: "{{ remote_working_dir }}"
+    state: directory
+
+- name: "Generating the configuration file"
+  ansible.builtin.template:
+    src: "{{ agent_conf }}"
+    dest: "{{ remote_working_dir }}/telegraf.conf"
diff --git a/enoslib/service/monitoring/roles/agent/tasks/container.yml b/enoslib/service/monitoring/roles/agent/tasks/container.yml
new file mode 100644
index 0000000000000000000000000000000000000000..35bb16126ea9fa8f31f6893df57abe62abcb4eb4
--- /dev/null
+++ b/enoslib/service/monitoring/roles/agent/tasks/container.yml
@@ -0,0 +1,18 @@
+---
+
+- name: Installing Telegraf
+  docker_container:
+    name: telegraf
+    image: "{{ agent_image }}"
+    detach: yes
+    state: started
+    recreate: yes
+    network_mode: host
+    volumes: 
+      - "{{ remote_working_dir }}/telegraf.conf:/etc/telegraf/telegraf.conf"
+      - /sys:/rootfs/sys:ro
+      - /proc:/rootfs/proc:ro
+      - /var/run/docker.sock:/var/run/docker.sock:ro
+    env:
+      HOST_PROC: "/rootfs/proc"
+      HOST_SYS: "/rootfs/sys"
diff --git a/enoslib/service/monitoring/roles/agent/tasks/deploy.yml b/enoslib/service/monitoring/roles/agent/tasks/deploy.yml
new file mode 100644
index 0000000000000000000000000000000000000000..6bd2d715f58a3148242d95620812ee5b11ef9f6e
--- /dev/null
+++ b/enoslib/service/monitoring/roles/agent/tasks/deploy.yml
@@ -0,0 +1,13 @@
+---
+
+- include_tasks: config.yml
+
+- name: Host architecture
+  ansible.builtin.debug:
+    var: ansible_architecture
+
+- include_tasks: container.yml
+  when: ansible_architecture != "armv7l"
+
+- include_tasks: binary.yml
+  when: ansible_architecture == "armv7l"
\ No newline at end of file
diff --git a/enoslib/service/monitoring/roles/agent/tasks/destroy.yml b/enoslib/service/monitoring/roles/agent/tasks/destroy.yml
new file mode 100644
index 0000000000000000000000000000000000000000..a88bc21a1112322796288d3f9c34e0e00bac2a50
--- /dev/null
+++ b/enoslib/service/monitoring/roles/agent/tasks/destroy.yml
@@ -0,0 +1,11 @@
+---
+- name: Destroying Telegraf
+  docker_container:
+    name: telegraf
+    state: absent
+    force_kill: yes
+  when: ansible_architecture != "armv7l"
+
+- name: Destroying Telegraf (binary)
+  shell: pgrep telegraf | xargs kill
+  when: ansible_architecture == "armv7l"
\ No newline at end of file
diff --git a/enoslib/service/monitoring/roles/agent/tasks/main.yml b/enoslib/service/monitoring/roles/agent/tasks/main.yml
new file mode 100644
index 0000000000000000000000000000000000000000..6a1679b97c6790350b3991d49e7df8240c98ba95
--- /dev/null
+++ b/enoslib/service/monitoring/roles/agent/tasks/main.yml
@@ -0,0 +1,2 @@
+---
+- include: "{{ enos_action }}.yml"
diff --git a/enoslib/service/monitoring/telegraf.conf.j2 b/enoslib/service/monitoring/roles/agent/templates/telegraf.conf.j2
similarity index 100%
rename from enoslib/service/monitoring/telegraf.conf.j2
rename to enoslib/service/monitoring/roles/agent/templates/telegraf.conf.j2
diff --git a/enoslib/service/monitoring/roles/collector/meta/main.yml b/enoslib/service/monitoring/roles/collector/meta/main.yml
new file mode 100644
index 0000000000000000000000000000000000000000..6127453ece771be89d285dd03f340d71ccf04c61
--- /dev/null
+++ b/enoslib/service/monitoring/roles/collector/meta/main.yml
@@ -0,0 +1,4 @@
+---
+dependencies:
+  - role: python3
+  - role: docker
diff --git a/enoslib/service/monitoring/roles/collector/tasks/backup.yml b/enoslib/service/monitoring/roles/collector/tasks/backup.yml
new file mode 100644
index 0000000000000000000000000000000000000000..77fc4e9f2d13ee81afe805d649b5f0eceafe87e8
--- /dev/null
+++ b/enoslib/service/monitoring/roles/collector/tasks/backup.yml
@@ -0,0 +1,22 @@
+---
+- name: Stopping InfluxDB
+  docker_container:
+    name: influxdb
+    state: stopped
+
+- name: Archiving the data volume
+  archive:
+    path: "{{ remote_working_dir }}/influxdb-data"
+    dest: "{{ remote_working_dir }}/influxdb-data.tar.gz"
+
+- name: Fetching the data volume
+  fetch:
+    src: "{{ remote_working_dir }}/influxdb-data.tar.gz"
+    dest: "{{ backup_dir }}/"
+    flat: yes
+
+- name: Restarting InfluxDB
+  docker_container:
+    name: influxdb
+    state: started
+    force_kill: yes
\ No newline at end of file
diff --git a/enoslib/service/monitoring/roles/collector/tasks/deploy.yml b/enoslib/service/monitoring/roles/collector/tasks/deploy.yml
new file mode 100644
index 0000000000000000000000000000000000000000..27a1f4f43346bcec26a4b11d0e61149f97acca67
--- /dev/null
+++ b/enoslib/service/monitoring/roles/collector/tasks/deploy.yml
@@ -0,0 +1,22 @@
+---
+
+- name: Installing InfluxDB
+  docker_container:
+    name: influxdb
+    image: influxdb
+    detach: yes
+    state: started
+    recreate: yes
+    network_mode: host
+    volumes: 
+      - "{{ remote_working_dir }}/influxdb-data:/var/lib/influxdb"
+    env: "{{ collector_env }}"
+
+
+- name: Waiting for InfluxDB to be ready
+  wait_for:
+    host: "172.17.0.1"
+    port: "{{ collector_port }}"
+    state: started
+    delay: 2
+    timeout: 120
\ No newline at end of file
diff --git a/enoslib/service/monitoring/roles/collector/tasks/destroy.yml b/enoslib/service/monitoring/roles/collector/tasks/destroy.yml
new file mode 100644
index 0000000000000000000000000000000000000000..07c77986c4c5ab1c12c8d78f9ca44cbe8d8de6f5
--- /dev/null
+++ b/enoslib/service/monitoring/roles/collector/tasks/destroy.yml
@@ -0,0 +1,11 @@
+---
+- name: Destroying InfluxDB
+  docker_container:
+    name: influxdb
+    state: absent
+    force_kill: yes
+
+- name: Removing InfluxDB database
+  file:
+    path: "{{ remote_working_dir }}/influxdb-data"
+    state: absent
\ No newline at end of file
diff --git a/enoslib/service/monitoring/roles/collector/tasks/main.yml b/enoslib/service/monitoring/roles/collector/tasks/main.yml
new file mode 100644
index 0000000000000000000000000000000000000000..6a1679b97c6790350b3991d49e7df8240c98ba95
--- /dev/null
+++ b/enoslib/service/monitoring/roles/collector/tasks/main.yml
@@ -0,0 +1,2 @@
+---
+- include: "{{ enos_action }}.yml"
diff --git a/enoslib/service/monitoring/roles/docker/tasks/main.yml b/enoslib/service/monitoring/roles/docker/tasks/main.yml
new file mode 100644
index 0000000000000000000000000000000000000000..e0870705f82ff2115f8565b6d733784135c1ff2d
--- /dev/null
+++ b/enoslib/service/monitoring/roles/docker/tasks/main.yml
@@ -0,0 +1,6 @@
+- name: Install docker
+  shell: "which docker || (curl -sSL https://get.docker.com/ | sh)"
+
+- name: Installing python-docker
+  pip:
+    name: docker
diff --git a/enoslib/service/monitoring/roles/python3/tasks/main.yml b/enoslib/service/monitoring/roles/python3/tasks/main.yml
new file mode 100644
index 0000000000000000000000000000000000000000..3eacbc0ace61dc58539a7121fddf323a8aa157a2
--- /dev/null
+++ b/enoslib/service/monitoring/roles/python3/tasks/main.yml
@@ -0,0 +1,2 @@
+- name: Install python3
+  shell: "(python --version | grep --regexp ' 3.*') || (apt update && apt install -y python3 python3-pip)"
diff --git a/enoslib/service/monitoring/roles/ui/meta/main.yml b/enoslib/service/monitoring/roles/ui/meta/main.yml
new file mode 100644
index 0000000000000000000000000000000000000000..6127453ece771be89d285dd03f340d71ccf04c61
--- /dev/null
+++ b/enoslib/service/monitoring/roles/ui/meta/main.yml
@@ -0,0 +1,4 @@
+---
+dependencies:
+  - role: python3
+  - role: docker
diff --git a/enoslib/service/monitoring/roles/ui/tasks/deploy.yml b/enoslib/service/monitoring/roles/ui/tasks/deploy.yml
new file mode 100644
index 0000000000000000000000000000000000000000..74ebdb75438fc571a406374fe2c91e7a45616f10
--- /dev/null
+++ b/enoslib/service/monitoring/roles/ui/tasks/deploy.yml
@@ -0,0 +1,36 @@
+---
+
+- name: Installing Grafana
+  docker_container:
+    name: grafana
+    image: grafana/grafana
+    detach: yes
+    state: started
+    recreate: yes
+    network_mode: host
+    env: "{{ ui_env }}"
+
+- name: Waiting for grafana to be ready
+  wait_for:
+    host: "{{ ui_address }}"
+    port: "{{ ui_port }}"
+    state: started
+    delay: 2
+    timeout: 120
+
+- name: Add InfluxDB in Grafana
+  uri:
+    url: "http://{{ ui_address }}:{{ ui_port }}/api/datasources"
+    user: admin
+    password: admin
+    force_basic_auth: yes
+    body_format: json
+    method: POST
+    status_code: [200, 409]
+    body:
+      name: telegraf
+      type:  influxdb
+      url: "http://{{ collector_address }}:{{ collector_port }}"
+      access: proxy
+      database: telegraf
+      isDefault: True
\ No newline at end of file
diff --git a/enoslib/service/monitoring/roles/ui/tasks/destroy.yml b/enoslib/service/monitoring/roles/ui/tasks/destroy.yml
new file mode 100644
index 0000000000000000000000000000000000000000..52aafc3e647a1aa5f7bd2037cc3460662bbf1deb
--- /dev/null
+++ b/enoslib/service/monitoring/roles/ui/tasks/destroy.yml
@@ -0,0 +1,6 @@
+---
+- name: Destroying Grafana
+  docker_container:
+    name: grafana
+    state: absent
+    force_kill: yes
\ No newline at end of file
diff --git a/enoslib/service/monitoring/roles/ui/tasks/main.yml b/enoslib/service/monitoring/roles/ui/tasks/main.yml
new file mode 100644
index 0000000000000000000000000000000000000000..6a1679b97c6790350b3991d49e7df8240c98ba95
--- /dev/null
+++ b/enoslib/service/monitoring/roles/ui/tasks/main.yml
@@ -0,0 +1,2 @@
+---
+- include: "{{ enos_action }}.yml"