diff --git a/Vagrantfile b/Vagrantfile
index b0c53997e7722b2ff45635e18be6c73837fa184d..ce424c8bcd31cb2244dc9f79600587a67fdb8389 100755
--- a/Vagrantfile
+++ b/Vagrantfile
@@ -118,7 +118,10 @@ Vagrant.configure("2") do |config|
 				vb.customize "pre-import", [ "setproperty", "machinefolder", File.join(File.dirname(__FILE__), vms.relative_machinefolder) ]
 				vb.customize "post-boot",  [ "setproperty", "machinefolder", "default" ]
 			end
+
 			subconfig.vm.network "private_network", ip: vms.management.ip, netmask: "255.255.255.0", auto_config: true, adapter: 2
+
+			subconfig.vm.network "forwarded_port", guest: 8001, host: 8001
 		end	
 
 		subconfig.disksize.size = vms.management unless vms.management.hdd.to_s
diff --git a/ansible/01_add_required_ansible_modules.sh b/ansible/01_add_required_ansible_modules.sh
new file mode 100755
index 0000000000000000000000000000000000000000..37fdf2c81c45f3bfd490b96b6a8be304927c9c42
--- /dev/null
+++ b/ansible/01_add_required_ansible_modules.sh
@@ -0,0 +1,12 @@
+#!/bin/bash
+set -e
+
+# check if docker-compose is available if it is installed exist
+hash docker-compose > /dev/null 2>&1 && exit 0 || true
+echo Provisioning ansible...
+
+SCRIPT_DIR=$(dirname "$0")
+cd $SCRIPT_DIR
+
+export ANSIBLE_CONFIG=$SCRIPT_DIR/ansible.cfg
+ansible-playbook $SCRIPT_DIR/add_required_ansible_modules/site.yaml
diff --git a/ansible/01_addHostsToEtcHosts.sh b/ansible/02_hosts_from_inventory.sh
similarity index 100%
rename from ansible/01_addHostsToEtcHosts.sh
rename to ansible/02_hosts_from_inventory.sh
diff --git a/ansible/02_upgrade.sh b/ansible/03_upgrade.sh
similarity index 100%
rename from ansible/02_upgrade.sh
rename to ansible/03_upgrade.sh
diff --git a/ansible/03_epel.sh b/ansible/04_epel.sh
similarity index 100%
rename from ansible/03_epel.sh
rename to ansible/04_epel.sh
diff --git a/ansible/04_development.sh b/ansible/05_development.sh
similarity index 100%
rename from ansible/04_development.sh
rename to ansible/05_development.sh
diff --git a/ansible/05_check_macs_vagrant_eth1.sh b/ansible/06_check_macs_vagrant_eth1.sh
similarity index 100%
rename from ansible/05_check_macs_vagrant_eth1.sh
rename to ansible/06_check_macs_vagrant_eth1.sh
diff --git a/ansible/06_install_kubernetes_kubeadm_docker.sh b/ansible/07_install_kubernetes_kubeadm_docker.sh
similarity index 100%
rename from ansible/06_install_kubernetes_kubeadm_docker.sh
rename to ansible/07_install_kubernetes_kubeadm_docker.sh
diff --git a/ansible/07_bootstrap_kubernetes_kubeadm.sh b/ansible/08_bootstrap_kubernetes_kubeadm.sh
similarity index 100%
rename from ansible/07_bootstrap_kubernetes_kubeadm.sh
rename to ansible/08_bootstrap_kubernetes_kubeadm.sh
diff --git a/ansible/08_enable_kubectl_at_management.sh b/ansible/09_enable_kubectl_at_management.sh
similarity index 100%
rename from ansible/08_enable_kubectl_at_management.sh
rename to ansible/09_enable_kubectl_at_management.sh
diff --git a/ansible/10_calico_network_kubernetes.sh b/ansible/10_calico_network_kubernetes.sh
new file mode 100755
index 0000000000000000000000000000000000000000..3d16a0614a9f58623688b53ee61ed1a7e195f039
--- /dev/null
+++ b/ansible/10_calico_network_kubernetes.sh
@@ -0,0 +1,12 @@
+#!/bin/bash
+set -e
+
+# check if docker-compose is available if it is installed exist
+hash docker-compose > /dev/null 2>&1 && exit 0 || true
+echo Provisioning ansible...
+
+SCRIPT_DIR=$(dirname "$0")
+cd $SCRIPT_DIR
+
+export ANSIBLE_CONFIG=$SCRIPT_DIR/ansible.cfg
+ansible-playbook $SCRIPT_DIR/calico_network_kubernetes/site.yaml
diff --git a/ansible/09_network_kubernetes.sh b/ansible/11_kubernetes_dashboard.sh
similarity index 81%
rename from ansible/09_network_kubernetes.sh
rename to ansible/11_kubernetes_dashboard.sh
index 7db6828551c3e9f5245dd19a18c378c3f7d71999..7049d5c642c69dedb8c0f267bebf028db941da9a 100755
--- a/ansible/09_network_kubernetes.sh
+++ b/ansible/11_kubernetes_dashboard.sh
@@ -9,4 +9,4 @@ SCRIPT_DIR=$(dirname "$0")
 cd $SCRIPT_DIR
 
 export ANSIBLE_CONFIG=$SCRIPT_DIR/ansible.cfg
-ansible-playbook $SCRIPT_DIR/network_kubernetes/site.yaml
+ansible-playbook $SCRIPT_DIR/kubernetes_dashboard/site.yaml
diff --git a/ansible/12_enable_helm_at_management.sh b/ansible/12_enable_helm_at_management.sh
new file mode 100755
index 0000000000000000000000000000000000000000..a32e24d340c595b5710c0f2c089f8532da1f0bc8
--- /dev/null
+++ b/ansible/12_enable_helm_at_management.sh
@@ -0,0 +1,12 @@
+#!/bin/bash
+set -e
+
+# check if docker-compose is available if it is installed exist
+hash docker-compose > /dev/null 2>&1 && exit 0 || true
+echo Provisioning ansible...
+
+SCRIPT_DIR=$(dirname "$0")
+cd $SCRIPT_DIR
+
+export ANSIBLE_CONFIG=$SCRIPT_DIR/ansible.cfg
+ansible-playbook $SCRIPT_DIR/enable_helm_at_management/site.yaml
diff --git a/ansible/13_install_metallb.sh b/ansible/13_install_metallb.sh
new file mode 100755
index 0000000000000000000000000000000000000000..83762023218acdfb4327cc1f77939fbdf0749349
--- /dev/null
+++ b/ansible/13_install_metallb.sh
@@ -0,0 +1,12 @@
+#!/bin/bash
+set -e
+
+# check if docker-compose is available if it is installed exist
+hash docker-compose > /dev/null 2>&1 && exit 0 || true
+echo Provisioning ansible...
+
+SCRIPT_DIR=$(dirname "$0")
+cd $SCRIPT_DIR
+
+export ANSIBLE_CONFIG=$SCRIPT_DIR/ansible.cfg
+ansible-playbook $SCRIPT_DIR/install_metallb/site.yaml -e "kubernetes_metallb_pool_start_ip=192.168.56.200" -e "kubernetes_metallb_pool_end_ip=192.168.56.210"
diff --git a/ansible/14_install_nginx_ingress.sh b/ansible/14_install_nginx_ingress.sh
new file mode 100755
index 0000000000000000000000000000000000000000..3260c1aecd9d53fc5af659c16a3504877225c9ce
--- /dev/null
+++ b/ansible/14_install_nginx_ingress.sh
@@ -0,0 +1,12 @@
+#!/bin/bash
+set -e
+
+# check if docker-compose is available if it is installed exist
+hash docker-compose > /dev/null 2>&1 && exit 0 || true
+echo Provisioning ansible...
+
+SCRIPT_DIR=$(dirname "$0")
+cd $SCRIPT_DIR
+
+export ANSIBLE_CONFIG=$SCRIPT_DIR/ansible.cfg
+ansible-playbook $SCRIPT_DIR/install_nginx_ingress/site.yaml
diff --git a/ansible/add_required_ansible_modules/ansible_kubernetes/files/requirements.yaml b/ansible/add_required_ansible_modules/ansible_kubernetes/files/requirements.yaml
new file mode 100755
index 0000000000000000000000000000000000000000..ca5ceb406daa1ce4170c0b9a8bec01480bc6e9c3
--- /dev/null
+++ b/ansible/add_required_ansible_modules/ansible_kubernetes/files/requirements.yaml
@@ -0,0 +1,4 @@
+---
+collections:
+# With just the collection name
+- community.kubernetes
diff --git a/ansible/add_required_ansible_modules/ansible_kubernetes/tasks/main.yaml b/ansible/add_required_ansible_modules/ansible_kubernetes/tasks/main.yaml
new file mode 100755
index 0000000000000000000000000000000000000000..c7dd1b766dcb7e3b8eff299dabe3dc7824c7763f
--- /dev/null
+++ b/ansible/add_required_ansible_modules/ansible_kubernetes/tasks/main.yaml
@@ -0,0 +1,13 @@
+# https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
+---
+- block:
+  - name: Add ansible module requirements
+    # https://github.com/helm/helm/releases
+    shell:
+      cmd: ansible-galaxy install -r {{ role_path }}/files/requirements.yaml
+    register: add_ansible_modules
+
+  - name: Add ansible module requirements
+    debug: 
+      msg: "{{ add_ansible_modules.cmd }}"
+  become: yes
\ No newline at end of file
diff --git a/ansible/add_required_ansible_modules/site.yaml b/ansible/add_required_ansible_modules/site.yaml
new file mode 100755
index 0000000000000000000000000000000000000000..f0c491fe00a0e23265b189006b54c342c30dfd93
--- /dev/null
+++ b/ansible/add_required_ansible_modules/site.yaml
@@ -0,0 +1,5 @@
+# modified from https://github.com/danpilch/easy-kubeadm
+---
+- hosts: management
+  roles:
+    - name: ansible_kubernetes
diff --git a/ansible/ansible.cfg b/ansible/ansible.cfg
index 0b5ddb022944c58a58530ddc022eb9818a5df229..6fe4f641448e41c3d4cc427c0d026750b7ad60a0 100755
--- a/ansible/ansible.cfg
+++ b/ansible/ansible.cfg
@@ -3,3 +3,4 @@
 host_key_checking = False
 inventory = hosts.yaml  ; This is relative to ansible.cfg folder
 remote_user = vagrant
+deprecation_warnings=False ; to remove the python version depretation warning
diff --git a/ansible/bootstrap_kubernetes_kubeadm/roles/kubernetes_master/tasks/main.yaml b/ansible/bootstrap_kubernetes_kubeadm/roles/kubernetes_master/tasks/main.yaml
index 1e92c6db340c326fdba04ce37ca72a96cec1245d..51932d63b15cfcf928694a876ee751eef33cfbd0 100755
--- a/ansible/bootstrap_kubernetes_kubeadm/roles/kubernetes_master/tasks/main.yaml
+++ b/ansible/bootstrap_kubernetes_kubeadm/roles/kubernetes_master/tasks/main.yaml
@@ -50,6 +50,6 @@
   - name: Start secondary master nodes command
     debug: 
       msg: "{{ kubeadm_master_join.cmd }}"
-    when: inventory_hostname in groups['kubernetes_masters'][1:] and is_multi_master
+    when: inventory_hostname in groups['kubernetes_masters'][1] 
 
   become: yes
\ No newline at end of file
diff --git a/ansible/bootstrap_kubernetes_kubeadm/roles/kubernetes_node/tasks/main.yaml b/ansible/bootstrap_kubernetes_kubeadm/roles/kubernetes_node/tasks/main.yaml
index fa581ef56f9bf902bacd2ffd9c0861314cc9692c..6ee633324e10f8829a62d9ff6c28a6460bebbadd 100755
--- a/ansible/bootstrap_kubernetes_kubeadm/roles/kubernetes_node/tasks/main.yaml
+++ b/ansible/bootstrap_kubernetes_kubeadm/roles/kubernetes_node/tasks/main.yaml
@@ -8,7 +8,7 @@
   - name: Start secondary master nodes command
     debug: 
       msg: "{{ kubeadm_node_join.cmd }}"
-    when: inventory_hostname in groups['kubernetes_nodes']['0']
+    when: inventory_hostname in groups['kubernetes_nodes'][0]
 
   become: yes
 
diff --git a/ansible/network_kubernetes/roles/calico/tasks/main.yaml b/ansible/calico_network_kubernetes/roles/calico/tasks/main.yaml
similarity index 100%
rename from ansible/network_kubernetes/roles/calico/tasks/main.yaml
rename to ansible/calico_network_kubernetes/roles/calico/tasks/main.yaml
diff --git a/ansible/network_kubernetes/site.yaml b/ansible/calico_network_kubernetes/site.yaml
similarity index 100%
rename from ansible/network_kubernetes/site.yaml
rename to ansible/calico_network_kubernetes/site.yaml
diff --git a/ansible/clean_kubernetes_docker/roles/clean-kubernetes/files/clean-kubernetes b/ansible/clean_kubernetes_docker/roles/clean-kubernetes/files/clean-kubernetes
index d26d626f83c04f4642c8e3a64d247b50d119bd8c..d3298188dc7f0755e2fc1175103afe6c0d7dbdd6 100755
--- a/ansible/clean_kubernetes_docker/roles/clean-kubernetes/files/clean-kubernetes
+++ b/ansible/clean_kubernetes_docker/roles/clean-kubernetes/files/clean-kubernetes
@@ -7,5 +7,6 @@ rm -rf /var/lib/kubelet /etc/kubernetes /var/lib/etcd /etc/cni /etc/kubernetes
 mkdir -p /etc/kubernetes
 ip link | grep -q cbr0 && ip link set cbr0 down && ip link del cbr0
 ip link | grep -q cni0 && ip link set cni0 down && ip link del cni0
+ip link | grep -q tunl0 && rmmod ipip
 systemctl start kubelet
 
diff --git a/ansible/enable_helm_at_management/roles/helm/tasks/main.yaml b/ansible/enable_helm_at_management/roles/helm/tasks/main.yaml
new file mode 100755
index 0000000000000000000000000000000000000000..a2e0c52c9feb0efde0d6056e853e422c2d1d1a50
--- /dev/null
+++ b/ansible/enable_helm_at_management/roles/helm/tasks/main.yaml
@@ -0,0 +1,22 @@
+# https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
+---
+- block:
+    - name: Retrieve helm binary archive.
+      # https://github.com/helm/helm/releases
+      unarchive:
+        src: https://get.helm.sh/helm-v3.6.0-linux-amd64.tar.gz
+        dest: /tmp
+        creates: /usr/bin/helm
+        remote_src: yes
+
+    - name: Move helm binary into place.
+      command: cp /tmp/linux-amd64/helm /usr/bin/helm
+      args:
+        creates: /usr/bin/helm
+  become: yes
+
+- name: Add helm autocompletion to bashrc for user
+  lineinfile:
+    dest: "/home/{{ ansible_user }}/.bashrc"
+    line: "source <(helm completion bash)"
+    state: present
diff --git a/ansible/enable_helm_at_management/site.yaml b/ansible/enable_helm_at_management/site.yaml
new file mode 100755
index 0000000000000000000000000000000000000000..e899a28ae47ef30798dbe0d3a2d0278cdda70057
--- /dev/null
+++ b/ansible/enable_helm_at_management/site.yaml
@@ -0,0 +1,5 @@
+# modified from https://github.com/danpilch/easy-kubeadm
+---
+- hosts: management
+  roles:
+    - name: helm
diff --git a/ansible/enable_kubectl_at_management/roles/kubectl_user/tasks/main.yaml b/ansible/enable_kubectl_at_management/roles/kubectl_user/tasks/main.yaml
index 5bd0bc3b49475bf0c986975a1404a93d6c4bbe2c..9b93030af8549705eecc6299b6ee96ec0ca6afb7 100755
--- a/ansible/enable_kubectl_at_management/roles/kubectl_user/tasks/main.yaml
+++ b/ansible/enable_kubectl_at_management/roles/kubectl_user/tasks/main.yaml
@@ -23,7 +23,7 @@
     owner: "{{ ansible_user }}"
     group: "{{ ansible_user }}"
 
-- name: Add kubectl autocompletion to bashrc for vagrant user
+- name: Add kubectl autocompletion to bashrc for user
   lineinfile:
     dest: "/home/{{ ansible_user }}/.bashrc"
     line: "source <(kubectl completion bash)"
diff --git a/ansible/enable_kubectl_at_management/site.yaml b/ansible/enable_kubectl_at_management/site.yaml
index c1d1ca05ffc5d3a75c97d104435158448b058b50..72a6e89099c6a56bbb55b478067d2595c359e6e2 100755
--- a/ansible/enable_kubectl_at_management/site.yaml
+++ b/ansible/enable_kubectl_at_management/site.yaml
@@ -16,4 +16,7 @@
 - hosts: management
   tasks:
     - name: Copy the file to {{ inventory_hostname }}
-      copy: src=buffer/admin.conf dest=/home/{{ ansible_user }}/.kube/config
+      copy: 
+        src: buffer/admin.conf 
+        dest: /home/{{ ansible_user }}/.kube/config
+        mode: '0600'
\ No newline at end of file
diff --git a/ansible/install_metallb/roles/metallb/tasks/main.yaml b/ansible/install_metallb/roles/metallb/tasks/main.yaml
new file mode 100755
index 0000000000000000000000000000000000000000..ade07381d6ad0e7a3efe6a9de134abb8ba3bd238
--- /dev/null
+++ b/ansible/install_metallb/roles/metallb/tasks/main.yaml
@@ -0,0 +1,25 @@
+---
+- name: Define sysconfig kubelet
+  template:
+    src: "values.yaml.j2"
+    dest: "/tmp/values.yaml"
+
+- name: Install bitnami repo 
+  kubernetes.core.helm_repository:
+    name: bitnami
+    repo_url: "{{ helm_chart_url }}"
+
+- name: Install metallb with helm
+  kubernetes.core.helm:
+    name: helm-bitnami-metallb
+    namespace: cluster-configuration
+    create_namespace: yes
+    chart_ref: bitnami/metallb
+    values_files:
+      - /tmp/values.yaml
+  register: install_metallb
+
+- name: Install metallb with helm command
+  debug: 
+    msg: "{{ install_metallb.command }}"
+
diff --git a/ansible/install_metallb/roles/metallb/templates/values.yaml.j2 b/ansible/install_metallb/roles/metallb/templates/values.yaml.j2
new file mode 100755
index 0000000000000000000000000000000000000000..79ac4e479f80e9bd42be15dac5635a919832cdf5
--- /dev/null
+++ b/ansible/install_metallb/roles/metallb/templates/values.yaml.j2
@@ -0,0 +1,6 @@
+configInline:
+  address-pools:
+    - name: default
+      protocol: layer2
+      addresses:
+        - {{ kubernetes_metallb_pool_start_ip }}-{{ kubernetes_metallb_pool_end_ip }}
\ No newline at end of file
diff --git a/ansible/install_metallb/roles/metallb/vars/main.yaml b/ansible/install_metallb/roles/metallb/vars/main.yaml
new file mode 100755
index 0000000000000000000000000000000000000000..44dc8aeb3b5ece182db458a3ab254cdcdea586c7
--- /dev/null
+++ b/ansible/install_metallb/roles/metallb/vars/main.yaml
@@ -0,0 +1,2 @@
+---
+helm_chart_url: "https://charts.bitnami.com/bitnami"
\ No newline at end of file
diff --git a/ansible/install_metallb/site.yaml b/ansible/install_metallb/site.yaml
new file mode 100755
index 0000000000000000000000000000000000000000..4dd96d6061a5786750f8092bf0214690e6edc41f
--- /dev/null
+++ b/ansible/install_metallb/site.yaml
@@ -0,0 +1,5 @@
+# modified from https://github.com/danpilch/easy-kubeadm
+---
+- hosts: management
+  roles:
+    - name: metallb
diff --git a/ansible/install_nginx_ingress/roles/nginx_ingress/tasks/main.yaml b/ansible/install_nginx_ingress/roles/nginx_ingress/tasks/main.yaml
new file mode 100755
index 0000000000000000000000000000000000000000..fa2f3bc11ca13cdee912843d3be7e18cb5803be2
--- /dev/null
+++ b/ansible/install_nginx_ingress/roles/nginx_ingress/tasks/main.yaml
@@ -0,0 +1,18 @@
+---
+- name: Install bitnami repo 
+  kubernetes.core.helm_repository:
+    name: bitnami
+    repo_url: "{{ helm_chart_url }}"
+
+- name: Install nginx ingress with helm
+  kubernetes.core.helm:
+    name: helm-bitnami-nginx-ingress
+    namespace: cluster-configuration
+    create_namespace: yes
+    chart_ref: bitnami/nginx-ingress-controller
+  register: install_nginx_ingress_controller
+
+- name: Install nginx ingress with helm command
+  debug: 
+    msg: "{{ install_nginx_ingress_controller.command }}"
+
diff --git a/ansible/install_nginx_ingress/roles/nginx_ingress/vars/main.yaml b/ansible/install_nginx_ingress/roles/nginx_ingress/vars/main.yaml
new file mode 100755
index 0000000000000000000000000000000000000000..44dc8aeb3b5ece182db458a3ab254cdcdea586c7
--- /dev/null
+++ b/ansible/install_nginx_ingress/roles/nginx_ingress/vars/main.yaml
@@ -0,0 +1,2 @@
+---
+helm_chart_url: "https://charts.bitnami.com/bitnami"
\ No newline at end of file
diff --git a/ansible/install_nginx_ingress/site.yaml b/ansible/install_nginx_ingress/site.yaml
new file mode 100755
index 0000000000000000000000000000000000000000..a1bc3c207f1df4e8fb02d119da7d75abb13e881c
--- /dev/null
+++ b/ansible/install_nginx_ingress/site.yaml
@@ -0,0 +1,6 @@
+# modified from https://github.com/danpilch/easy-kubeadm
+---
+- hosts: management
+  roles:
+    - name: nginx_ingress
+    
diff --git a/ansible/kubernetes_dashboard/roles/dashboard/tasks/main.yaml b/ansible/kubernetes_dashboard/roles/dashboard/tasks/main.yaml
new file mode 100755
index 0000000000000000000000000000000000000000..dca4057a938a33912d03e374b5a8891b2709988c
--- /dev/null
+++ b/ansible/kubernetes_dashboard/roles/dashboard/tasks/main.yaml
@@ -0,0 +1,9 @@
+# https://kubernetes.io/docs/tasks/access-application-cluster/web-ui-dashboard/
+# https://github.com/kubernetes/dashboard/tags
+---
+- name: Install kubernetes dashboard
+  shell: "kubectl apply -f 'https://raw.githubusercontent.com/kubernetes/dashboard/v2.2.0/aio/deploy/recommended.yaml'"
+  register: dashboard_network
+- name: Install kubernetes dashboard command
+  debug: 
+    msg: "{{ dashboard_network.cmd }}"
\ No newline at end of file
diff --git a/ansible/kubernetes_dashboard/site.yaml b/ansible/kubernetes_dashboard/site.yaml
new file mode 100755
index 0000000000000000000000000000000000000000..a62720eb84154be9fb97e141445b26a5c0fb3ee8
--- /dev/null
+++ b/ansible/kubernetes_dashboard/site.yaml
@@ -0,0 +1,5 @@
+# modified from https://github.com/danpilch/easy-kubeadm
+---
+- hosts: management
+  roles:
+    - name: dashboard
diff --git a/scripts/ansible/install.sh b/scripts/ansible/install.sh
index c2b65b2f82a8f2db30d6d61741b6ac146add1ed1..e1bdefa50c00e75a326218eef215faae105e53af 100755
--- a/scripts/ansible/install.sh
+++ b/scripts/ansible/install.sh
@@ -5,5 +5,17 @@ set -e
 hash ansible-playbook > /dev/null 2>&1 && exit 0 || true
 echo Provisioning ansible...
 
-sudo dnf install epel-release -y
-sudo dnf install ansible -y
\ No newline at end of file
+# this script is executed as sudo therefore no need of sudo
+dnf install epel-release -y
+dnf install python3-pip -y
+
+# https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html#upgrading-ansible-with-pip
+python3 -m pip install --upgrade pip
+python3 -m pip install ansible 
+
+# activamos el autocompletado para todos los comandos de python en concreto por ansible
+python3 -m pip install argcomplete
+/usr/local/bin/activate-global-python-argcomplete
+
+# Centos 8 vbox has no /usr/local/bin in root path, and is where pip install ansible executables
+sed -i -e "s|\(Defaults    secure_path.*\)|\1:/usr/local/bin|m" /etc/sudoers