Add configurable etcd storage feature

Plus the option to have etcd on tmpfs (volatile storage) for little
bigger (maybe) speed (NOT FOR PRODUCTION DEPLOYMENT!).

Issue-ID: OOM-2058

Change-Id: I0bbfc4fbae7f6b46e2fae49656437cd6748efd49
Signed-off-by: Petr Ospalý <p.ospaly@partner.samsung.com>
diff --git a/ansible/roles/rke/defaults/main.yml b/ansible/roles/rke/defaults/main.yml
index 2f160fc..d9c044b 100644
--- a/ansible/roles/rke/defaults/main.yml
+++ b/ansible/roles/rke/defaults/main.yml
@@ -6,6 +6,46 @@
 cluster_config_dir: "{{ app_data_path }}/cluster"
 # Whether dashboard is exposed.
 rke_dashboard_exposed: true
+rke_etcd:
+  # By default rke creates bind mount:
+  # /var/lib/etcd -> /var/lib/rancher/etcd
+  # These parameters provide means of modifying it:
+  #   - custom bind mount
+  #   - option to use volatile storage
+
+  # Custom bind mount
+  #
+  # I did not find a proper way (in the docs) how to override the
+  # defaults so I just abuse the extra_* args for the rke etcd
+  # service. It means that it will create another mount point in the
+  # container and you should use different pathnames than default...
+  #
+  # The custom bind mount is by default disabled.
+  enabled_custom_etcd_storage: false
+
+  # Applicated only if custom mount is enabled.
+  # Paths must be absolute (start with '/')
+  #
+  # Path on the kubernetes/etcd node
+  storage_path: /var/lib/etcd-custom
+  # Path inside the container where it is mounted.
+  storage_mountpoint: /var/lib/rancher/etcd-custom
+
+  # On top of it (with or without custom mount) you can use tmpfs
+  # as a volatile storage.
+  #
+  # CAUTION: This will create temporary filesystem (in the memory)
+  # so if an etcd node will be poweroff then all etcd data will be
+  # lost!!!
+  #
+  # Don't use unless you don't care about your cluster!
+  #
+  # This is intended as an attempt to make deployment little bit
+  # more faster...by default it is disabled.
+  enabled_unsafe_volatile_storage: false
+  # Size of the volatile storage - tmpfs (this will eat your RAM)
+  tmpfs_size: 5G
+
 rke:
   # rke (rancher) images
   etcd: rancher/coreos-etcd:v3.2.24-rancher1
diff --git a/ansible/roles/rke/tasks/rke_etcd.yml b/ansible/roles/rke/tasks/rke_etcd.yml
new file mode 100644
index 0000000..3dddf9e
--- /dev/null
+++ b/ansible/roles/rke/tasks/rke_etcd.yml
@@ -0,0 +1,9 @@
+---
+- name: "Mount tmpfs as etcd storage - non-persistent data (BEWARE)"
+  mount:
+    path: "{{ rke_etcd.storage_path if rke_etcd.enabled_custom_etcd_storage else '/var/lib/etcd' }}"
+    src: tmpfs
+    fstype: tmpfs
+    opts: "defaults,size={{ rke_etcd.tmpfs_size }},mode=700"
+    state: mounted
+  when: rke_etcd.enabled_unsafe_volatile_storage
diff --git a/ansible/roles/rke/templates/cluster.yml.j2 b/ansible/roles/rke/templates/cluster.yml.j2
index 2012ab9..737d306 100644
--- a/ansible/roles/rke/templates/cluster.yml.j2
+++ b/ansible/roles/rke/templates/cluster.yml.j2
@@ -25,8 +25,15 @@
 services:
   etcd:
     image: ""
+{% if rke_etcd.enabled_custom_etcd_storage %}
+    extra_args:
+      data-dir: "{{ rke_etcd.storage_mountpoint }}"
+    extra_binds:
+      - "{{ rke_etcd.storage_path }}:{{ rke_etcd.storage_mountpoint }}"
+{% else %}
     extra_args: {}
     extra_binds: []
+{% endif %}
     extra_env: []
     external_urls: []
     ca_cert: ""