diff --git a/README.md b/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..e89e37d1f00cca8fad64b53118ed2e0e4117557c
--- /dev/null
+++ b/README.md
@@ -0,0 +1,7 @@
+## Resources
+
+- [Install](https://www.elastic.co/guide/en/beats/heartbeat/6.5/heartbeat-installation.html)
+- [Blogpost](https://www.elastic.co/blog/uptime-monitoring-with-heartbeat-and-the-elastic-stack)
+- [Forum](https://discuss.elastic.co/c/beats/heartbeat)
+- [GitHub](https://github.com/elastic/beats)
+- [Monitor Config](https://www.elastic.co/guide/en/beats/heartbeat/6.5/configuration-heartbeat-options.html)
diff --git a/handlers/main.yml b/handlers/main.yml
new file mode 100644
index 0000000000000000000000000000000000000000..32317349c7066c87e6dd2d482ea4b0802b58c2fd
--- /dev/null
+++ b/handlers/main.yml
@@ -0,0 +1,19 @@
+---
+# file: roles/heartbeat/handlers/main.yml
+
+- name: "Add Heartbeat to Boot-List"
+  systemd:
+    name: 'heartbeat-elastic'
+    state: 'started'
+    daemon_reload: yes
+    enabled: yes
+
+- name: "Start Heartbeat"
+  service:
+    name: 'heartbeat-elastic'
+    state: 'started'
+
+- name: "Restart Heartbeat"
+  service:
+    name: 'heartbeat-elastic'
+    state: 'restarted'
diff --git a/meta/main.yml b/meta/main.yml
new file mode 100644
index 0000000000000000000000000000000000000000..08947d7814d175dcc05547b85f504fac1714cbe0
--- /dev/null
+++ b/meta/main.yml
@@ -0,0 +1,4 @@
+---
+
+dependencies:
+- { role: kibana }
diff --git a/tasks/config.yml b/tasks/config.yml
new file mode 100644
index 0000000000000000000000000000000000000000..1b42116529d2b70400b4a9e8389850722c64b706
--- /dev/null
+++ b/tasks/config.yml
@@ -0,0 +1,23 @@
+---
+# file: roles/heartbeat/tasks/config.yml
+
+- name: "Ensure config directories"
+  file:
+    path: '/etc/heartbeat/monitors.d'
+    state: 'directory'
+
+- name: "Configure Heartbeat"
+  template:
+    src: 'heartbeat.yml'
+    dest: '/etc/heartbeat/heartbeat.yml'
+    owner: 'root'
+    group: 'root'
+    mode: '600'
+  notify:
+  - "Restart Heartbeat"
+
+- name: "Copy all monitor configurations"
+  copy:
+    src: '{{ inventory_dir }}/files/heartbeat/'
+    dest: '/etc/heartbeat/monitors.d/'
+    mode: '600'
diff --git a/tasks/install.yml b/tasks/install.yml
new file mode 100644
index 0000000000000000000000000000000000000000..6f3369f733073631e8c39abb863ef776aafe6b0d
--- /dev/null
+++ b/tasks/install.yml
@@ -0,0 +1,22 @@
+---
+# file: roles/heartbeat/tasks/install.yml
+
+- name: "Apt Key"
+  apt_key:
+    url: 'https://artifacts.elastic.co/GPG-KEY-elasticsearch'
+    state: 'present'
+
+- name: "Apt Repository"
+  apt_repository:
+    repo: 'deb https://artifacts.elastic.co/packages/6.x/apt stable main'
+    state: 'present'
+    mode: '644'
+
+- name: "Install Heartbeat"
+  apt:
+    pkg: 'heartbeat-elastic'
+    state: 'present'
+    update_cache: yes
+  notify:
+  - "Add Heartbeat to Boot-List"
+  - "Start Heartbeat"
diff --git a/tasks/main.yml b/tasks/main.yml
new file mode 100644
index 0000000000000000000000000000000000000000..812a2e01eeb1ed379c833eb5e8ab6dace0ce3e75
--- /dev/null
+++ b/tasks/main.yml
@@ -0,0 +1,14 @@
+---
+# file: roles/heartbeat/tasks/main.yml
+
+- name: "Heartbeat Role"
+  set_fact: role_heartbeat_started=true
+  tags: 'always'
+
+- block:
+
+  - include_tasks: install.yml
+
+  - include_tasks: config.yml
+
+  when: '"heartbeat" not in excluded_roles'
diff --git a/templates/heartbeat.yml b/templates/heartbeat.yml
new file mode 100644
index 0000000000000000000000000000000000000000..0a2610019c1a27b9692576a4696be67633dbd497
--- /dev/null
+++ b/templates/heartbeat.yml
@@ -0,0 +1,144 @@
+################### Heartbeat Configuration Example #########################
+
+# This file is an example configuration file highlighting only some common options.
+# The heartbeat.reference.yml file in the same directory contains all the supported options
+# with detailed comments. You can use it for reference.
+#
+# You can find the full configuration reference here:
+# https://www.elastic.co/guide/en/beats/heartbeat/index.html
+
+############################# Heartbeat ######################################
+
+# Configure monitors
+heartbeat.config.monitors:
+  path: /etc/heartbeat/monitors.d/*.yml
+  reload.enabled: true
+  reload.period: 5s
+
+#==================== Elasticsearch template setting ==========================
+
+setup.template.settings:
+  index.number_of_shards: 1
+  index.codec: best_compression
+  #_source.enabled: false
+
+#================================ General =====================================
+
+# The name of the shipper that publishes the network data. It can be used to group
+# all the transactions sent by a single shipper in the web interface.
+#name:
+
+# The tags of the shipper are included in their own field with each
+# transaction published.
+#tags: ["service-X", "web-tier"]
+
+# Optional fields that you can specify to add additional information to the
+# output.
+#fields:
+#  env: staging
+
+
+#============================== Dashboards =====================================
+# These settings control loading the sample dashboards to the Kibana index. Loading
+# the dashboards is disabled by default and can be enabled either by setting the
+# options here, or by using the `-setup` CLI flag or the `setup` command.
+#setup.dashboards.enabled: false
+
+# The URL from where to download the dashboards archive. By default this URL
+# has a value which is computed based on the Beat name and version. For released
+# versions, this URL points to the dashboard archive on the artifacts.elastic.co
+# website.
+#setup.dashboards.url:
+
+#============================== Kibana =====================================
+
+# Starting with Beats version 6.0.0, the dashboards are loaded via the Kibana API.
+# This requires a Kibana endpoint configuration.
+setup.kibana:
+
+# Kibana Host
+# Scheme and port can be left out and will be set to the default (http and 5601)
+# In case you specify and additional path, the scheme is required: http://localhost:5601/path
+# IPv6 addresses should always be defined as: https://[2001:db8::1]:5601
+#host: "localhost:5601"
+
+# Kibana Space ID
+# ID of the Kibana Space into which the dashboards should be loaded. By default,
+# the Default Space will be used.
+#space.id:
+
+#============================= Elastic Cloud ==================================
+
+# These settings simplify using heartbeat with the Elastic Cloud (https://cloud.elastic.co/).
+
+# The cloud.id setting overwrites the `output.elasticsearch.hosts` and
+# `setup.kibana.host` options.
+# You can find the `cloud.id` in the Elastic Cloud web UI.
+#cloud.id:
+
+# The cloud.auth setting overwrites the `output.elasticsearch.username` and
+# `output.elasticsearch.password` settings. The format is `<user>:<pass>`.
+#cloud.auth:
+
+#================================ Outputs =====================================
+
+# Configure what output to use when sending the data collected by the beat.
+
+#-------------------------- Elasticsearch output ------------------------------
+output.elasticsearch:
+  # Array of hosts to connect to.
+  hosts: ["localhost:9200"]
+
+  # Optional protocol and basic auth credentials.
+  #protocol: "https"
+  #username: "elastic"
+  #password: "changeme"
+
+  #----------------------------- Logstash output --------------------------------
+  #output.logstash:
+  # The Logstash hosts
+  #hosts: ["localhost:5044"]
+
+  # Optional SSL. By default is off.
+  # List of root certificates for HTTPS server verifications
+  #ssl.certificate_authorities: ["/etc/pki/root/ca.pem"]
+
+  # Certificate for SSL client authentication
+  #ssl.certificate: "/etc/pki/client/cert.pem"
+
+  # Client Certificate Key
+  #ssl.key: "/etc/pki/client/cert.key"
+
+#================================ Procesors =====================================
+
+# Configure processors to enhance or manipulate events generated by the beat.
+
+processors:
+- add_host_metadata: ~
+- add_cloud_metadata: ~
+
+#================================ Logging =====================================
+
+# Sets log level. The default log level is info.
+# Available log levels are: error, warning, info, debug
+#logging.level: debug
+
+# At debug level, you can selectively enable logging only for some components.
+# To enable all selectors use ["*"]. Examples of other selectors are "beat",
+# "publish", "service".
+#logging.selectors: ["*"]
+
+#============================== Xpack Monitoring ===============================
+# heartbeat can export internal metrics to a central Elasticsearch monitoring
+# cluster.  This requires xpack monitoring to be enabled in Elasticsearch.  The
+# reporting is disabled by default.
+
+# Set to true to enable the monitoring reporter.
+#xpack.monitoring.enabled: false
+
+# Uncomment to send the metrics to Elasticsearch. Most settings from the
+# Elasticsearch output are accepted here as well. Any setting that is not set is
+# automatically inherited from the Elasticsearch output configuration, so if you
+# have the Elasticsearch output configured, you can simply uncomment the
+# following line.
+#xpack.monitoring.elasticsearch: